如何设置/获取对象数组中对象的值?
目前我得到: "对象不包含'值'的定义没有扩展方法"
示例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 :(得分: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
的一半时间是正确的,一半的时间是错误的。