我在字典类型集合中有以下循环
foreach(KeyValuePair<Vector2, Object> entry in v_map.map_set)
{
}
我想访问对象属性,但预期的语法不起作用。 E.G:
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;
}
}
答案 0 :(得分:2)
您可以使用Reflection来获取对象的属性值。
类似这样的事情
PropertyInfo info2 = object.GetType().GetProperty("prpertyname");
Object val = info2.GetValue(object, null);
答案 1 :(得分:2)
如果您知道KeyValuePair中对象的类型,则可以将其强制转换为该类型,并且您将能够找到所需的属性。
如果您存储了多个不同的对象,则可以使用is
检查它是哪种类型。
像这样:
if(entry.Value is Foo)
{
Foo lFoo = (Foo)entry.Value;
}
else if(entry.Value is Bar)
{
Bar lBar = (Bar)entry.Value;
}
答案 2 :(得分: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);
答案 3 :(得分:0)
您需要将entry.Value
投射到您需要的类型。 Object类型本身不会公开您想要的属性。
答案 4 :(得分:0)
如果您只需要访问这些值,并且您知道可以使用的预期类型
foreach(ExpectedType value in v_map.map_set.Values.OfType<ExpectedType>())
{
var property = value.Property;
}
其中Property
是ExpectedType
上的属性。