4

我在字典类型集合上有以下循环

foreach(KeyValuePair<Vector2, Object> entry in v_map.map_set)
{

}

我想访问对象属性,但预期的语法不起作用。例如:

foreach(KeyValuePair<Vector2, Object> entry in v_map.map_set)
            {
                Object ob = entry.Value;
                ob.property;
            }

失败,因为 C# 找不到想要的属性。那么,如何访问所需的属性?

解决方案:

  foreach(KeyValuePair<Vector2, Object> entry in v_map.map_set)
            {
                if (entry.Value is warehouse)
                {
                    warehouse ob = (warehouse)entry.Value;

                }
            }
4

5 回答 5

2

您可以利用 Refection 来获取对象的属性值。

像这样的东西

PropertyInfo info2 = object.GetType().GetProperty("prpertyname");
Object val = info2.GetValue(object, null);
于 2013-01-09T13:57:50.930 回答
2

如果您知道 KeyValuePair 中对象的类型,则可以将其强制转换为该类型,您将能够找到所需的属性。

如果您存储了多个不同的对象,您可以使用is. 像这样:

if(entry.Value is Foo)
{
   Foo lFoo = (Foo)entry.Value;
}
else if(entry.Value is Bar)
{
   Bar lBar = (Bar)entry.Value;
}
于 2013-01-09T13:58:36.077 回答
0

问题是您使用的object是未键入的。所以你需要像这样使用反射:

PropertyInfo pi = ob.GetType().GetProperty("PropertyName");
var val = pi.GetValue(ob, null);

现在,如果该属性不是,public那么您将需要使用其他类似的东西:

PropertyInfo pi = ob.GetType().GetProperty("PropertyName", BindingFlags.Instance | BindingFlags.NonPublic);
var val = pi.GetValue(ob, null);

现在,如果这实际上是您想要进入的领域,那么您甚至需要做一些不同的事情:

FieldInfo fi = ob.GetType().GetField("fieldName");
var val = fi.GetValue(ob);

获取属性方法

BindingFlags 枚举

GetField 方法

于 2013-01-09T13:58:31.650 回答
0

您需要转换entry.Value为所需的类型。Object类型本身不会公开您想要的属性。

于 2013-01-09T14:00:16.083 回答
0

如果您只需要访问这些值,并且您知道可以使用的预期类型

foreach(ExpectedType value in v_map.map_set.Values.OfType<ExpectedType>())
{
    var property = value.Property;
}

Property的属性在哪里ExpectedType

于 2013-01-09T14:02:31.897 回答