2017-09-05 54 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()); 
相关问题