如何访问对象数组C#中的子类方法?

时间:2017-09-05 09:54:15

标签: 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?

    }

5 个答案:

答案 0 :(得分:4)

这是因为通用object没有您的班级value拥有的属性myObjClass。要解决此问题,您可以 cast 将该项目发送到您的班级,如下所示:

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

如果您确定类型

,则只执行此操作

您可以先检查一下:

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 :(得分:2)

使用对象数组时,必须在访问字段之前强制转换为真实类型(此处为:myObjClass):

您可以像这样访问对象

((myObjClass)objArr[0]).value

但我不建议。你不能让你的阵列成为具体类型

var array = new myObjClass[42]

检索值的紧凑安全替代方法是

(objArr[0] as myObjClass)?.value

答案 2 :(得分:1)

您需要将对象强制转换为myObjClass的已知类型,如:

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

或者您可以使用reflection

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

希望有所帮助,

答案 3 :(得分: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());

答案 4 :(得分:0)

你有一个对象,确实是myObjClass的一个实例,并且有一个value字段,但你有两个引用它。

编译器已知其中一个(myObj)属于myObjClass类型,并且可以保证它具有value字段。

另一个(objArr[0])仅为编译器所知,属于object类型,并且不能保证它具有value字段。

例如,你可以这样做:

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

我们将在运行时根据随机数的值来决定,这将是objArr[0]处实际对象的类型。

所以,如果这是允许的,那么objArr[0].value的一半时间是正确的,一半的时间是错误的。