循环通过包含对象的字典

时间:2013-01-09 13:56:13

标签: c# loops dictionary

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

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;

                }
            }

5 个答案:

答案 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);

GetProperty method

BindingFlags enumeration

GetField method

答案 3 :(得分:0)

您需要将entry.Value投射到您需要的类型。 Object类型本身不会公开您想要的属性。

答案 4 :(得分:0)

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

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

其中PropertyExpectedType上的属性。