【问题标题】:Looping though a dictionary containing objects遍历包含对象的字典
【发布时间】:2012-12-23 14:17:16
【问题描述】:

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

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;

                }
            }

【问题讨论】:

  • 期望值是什么类型?你能让字典在值类型中通用吗?如果没有,则必须强制转换,或者如果没有包含所需属性的通用基本类型,则可以使用 dynamic
  • 该值将是一系列不同的对象。我可以预测什么类型的对象,但我需要将它们通用存储以正确维护 ke 值链接。

标签: c# loops dictionary


【解决方案1】:

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

如果您存储了多个不同的对象,您可以使用is 检查它的类型。 像这样:

if(entry.Value is Foo)
{
   Foo lFoo = (Foo)entry.Value;
}
else if(entry.Value is Bar)
{
   Bar lBar = (Bar)entry.Value;
}

【讨论】:

  • @tracertong,这里要记住的一件事是这个解决方案是不可扩展的(尽管如果没有很多类型或者类型不会激增可能并不重要时间)。要记住的另一件事是,如果每种类型都具有完全相同的属性名称(如 Geerten 在示例中所示),那么反射是一个更好的解决方案,因为它只需要几行代码(oh and would beg用于接口,以便您可以简单地将它们转换为接口类型,在这种情况下,您甚至不需要反射)。
【解决方案2】:

问题是您使用的是未输入的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】:

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

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

    其中PropertyExpectedType 上的属性。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        类似的东西

        PropertyInfo info2 = object.GetType().GetProperty("prpertyname");
        Object val = info2.GetValue(object, null);
        

        【讨论】:

          猜你喜欢
          • 2015-09-09
          • 2013-01-21
          • 1970-01-01
          • 2014-06-30
          • 1970-01-01
          • 2010-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多