【问题标题】:Cannot convert type 'System.Reflection.PropertyInfo' to无法将类型“System.Reflection.PropertyInfo”转换为
【发布时间】:2017-11-23 17:39:08
【问题描述】:

我正在尝试使用反射来迭代我的一个类中的所有属性:

public MDInstrument() : base()
    {
        PropertyInfo[] properties = typeof(MDInstrument).GetProperties();

        foreach (PropertyInfo item in properties)
        {
            var tick = item as TickData;
        }
    }

当我检查 var 属性时,我可以正确看到所有属性

但是就行了:

 var tick = item as TickData;

我收到错误:

添加

您好,感谢您的反馈。我不是想获得价值。代码在构造函数中。我正在尝试循环类中的对象,如果它们是“TickData”类型,那么我想将它们添加到列表中。我通过尝试使用 as 关键字进行强制转换来做到这一点。我一定是错过了什么。

【问题讨论】:

  • 最好将错误消息作为文本发布,而不是屏幕截图。
  • 如果对你有用,请接受答案

标签: c# reflection


【解决方案1】:

您需要使用PropertyInfo.GetValue 来为您带来价值,并且您可以将其转换为您想要的类型。

 private static void GetPropertyValues(Object obj)
   {
      Type t = obj.GetType();
      Console.WriteLine("Type is: {0}", t.Name);
      PropertyInfo[] props = t.GetProperties();
      Console.WriteLine("Properties (N = {0}):", 
                        props.Length);
      foreach (var prop in props)
         if (prop.GetIndexParameters().Length == 0)
            Console.WriteLine("   {0} ({1}): {2}", prop.Name,
                              prop.PropertyType.Name,
                              prop.GetValue(obj));
         else
            Console.WriteLine("   {0} ({1}): <Indexed>", prop.Name,
                              prop.PropertyType.Name);

   }

为了转换,你可以让Convert.ChangeType的用户

Convert.ChangeType(number, typeof(int))

【讨论】:

    【解决方案2】:

    编辑:基于 OP 评论: 如果要检查属性的类型,则需要PropertyInfoPropertyType 属性。请注意,您不能在运行时类型元数据上使用 asis。如果你写

    var isType = item.Type is MyType;
    

    你总是会得到false,这是因为尽管item.Type 代表某种类型,比如MyType,它的类型(即静态类型)不是MyType,而是派生自Type 的类型(通常是@ 987654333@)。如果您意识到 PropertyInfo.PropertyType 是一个运行时构造,而 is 是一个编译时构造(编译器无法知道所代表的类型),这真的很有意义。所以要解决这个问题,你需要使用运行时工具来处理类型数据。

    • 同样输入:

      item.PropertyType == typeof(MyType)
      
    • Type.IsAssignableFrom:

      typeof(MyType).IsAssignableFrom(item.PropertyType)
      

    旧答案供参考:

    我认为您误解了反射的工作原理,PropertyInfo 仅表示有关该属性的静态元数据,您无法直接获取其值,因为如果您考虑一下,您会丢失一些信息:您要从哪个实例获取属性? PropertyInfo 未绑定到任何实例。要获取您需要使用的值GetValue:

    var value = item.GetValue(instance);
    

    【讨论】:

    • 您好,感谢您的反馈。我不是想获得价值。代码在构造函数中。我正在尝试循环类中的对象,如果它们是“TickData”类型,那么我想将它们添加到列表中。我通过尝试使用 as 关键字进行强制转换来做到这一点。我一定是错过了什么。
    • @GKonheiser 请将此评论添加到您的问题中,因为它完全改变了它。
    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多