2017-09-05 80 views
0

如何設置/獲取對象數組中的對象的值?如何訪問對象數組C#中的子類的方法?

目前我得到: 「對象不包含關於‘值’和沒有擴展方法的定義」

例C#;

public class myObjClass 
    { 
     public int value = 5; 
    } 

    public class myObjClass2 
    { 
     public float[] pos = new float[2]; 
    } 

    public void test() 
    { 
     myObjClass myObj = new myObjClass(); 
     myObjClass2 myObj2 = new myObjClass2(); 

     object[] objArr = new object[2]; 
     objArr[0] = myObj; 
     objArr[1] = myObj2; 
     Debug.Print(myObj.value.ToString()); 
     Debug.Print(objArr[0].value.ToString()); // how? 

    } 
+0

** object **不包含'value'的定義,** myObjClass **的確如此。你需要施放。或者讓它成爲'myObjClass [] objArr''。順便說一下,類名應該以大寫字母開頭。 – Fildor

+1

你爲什麼使用對象數組? –

+1

不要使用它創建問題的對象。使用真正的課堂類型。使用以下內容:myObjClass [] objArr = new myObjClass [2]; – jdweng

回答

4

它,因爲通用object沒有財產value你的班級myObjClass有。爲了解決這個問題你可以cast的項目類,像這樣:

((myObjClass)objArr[0]).value.ToString() 

只有做到這一點^如果你確信類型


相反,你也可以檢查一下第一個:

With as

var item = objArr[0] as myObjClass; 
if(item != null) // Item will be null if its not a 'myObjClass' 
{ 
    //Do stuff with item 
} 

或用is

if(objArr[0] is myObjClass) 
{ 
    var item = (myObjClass)objArr[0]; 
    //Do stuff with item 
} 
1

您需要轉換對象到已知類型是myObjClass,如:

((myObjClass)objArr[0]).value.ToString(); 

或者你可以使用reflection

var valueString = objArr[0].GetType().GetProperty("value").GetValue(objArr[0]); 
Debug.Print(valueString.ToString()); 

希望幫助,

2

使用時,你必須強制轉換爲真正的類型(這裏:myObjClass)的對象數組:

您可以訪問接入領域之前像這樣的物體

((myObjClass)objArr[0]).value 

但是我不會推薦。不容你有你的陣列是具體類型

var array = new myObjClass[42] 

緊湊安全的替代檢索值是

(objArr[0] as myObjClass)?.value 
0

你有一個單一的對象,確實是myObjClass一個實例,有一個value字段,但您有兩個引用。

其中一個(myObj)被編譯器稱爲myObjClass,它可以保證它有一個value字段。

另一個(objArr[0])只有編譯器知道是object類型,並且它不能保證它有一個value字段。

例如,你可以這樣做:

objArr[0] = (random.Next() > 0.5) : myObj ? myObj2 

,我們要去決定在運行時,基於隨機數,這將是實際對象的類型在objArr[0]的價值。

所以,如果這是允許的,一半的時間objArr[0].value將是正確的,一半的時間將是一個錯誤。

1

從技術上講,你可以把它看成

Debug.Print((objArr[0] as myObjClass)?.value.ToString()); 

我們試圖鑄造objArr[0]myObjClass如果成功得到value,並把它轉化爲string。如果objArr[0]不是myObjClass我們返回null作爲一個字符串

然而,更好的辦法是落實ToString()這兩類感興趣:

public class myObjClass 
{ 
    public int value = 5; 

    public override string ToString() { 
     // When debugging we want to know "value" 
     return value.ToString(); 
    } 
} 

public class myObjClass2 
{ 
    public float[] pos = new float[2]; 

    public override string ToString() { 
     // When debugging we want to know "pos[0]" and "pos[1]" values 
     return $"{pos[0]} : {pos[1]}"; 
    } 
} 

然後把一個簡單的

// Just print out debug info (we don't want to know the actual objArr[0] class) 
Debug.Print(objArr[0].ToString());