无法转换类型' System.Reflection.PropertyInfo'至

时间:2017-11-23 08:18:50

标签: c# reflection

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

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

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

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

enter image description here

但在线:

 var tick = item as TickData;

我收到错误:

enter image description here

ADDITION

嗨感谢您的反馈。我不是想要获得价值。代码在构造函数中。我试图循环类中的对象,如果它们是类型' TickData'然后我想将它们添加到列表中。我这样做是通过使用as关键字尝试强制转换。我一定错过了什么。

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

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

var isType = item.Type is MyType;

你总是得到false,因为虽然item.Type代表某种类型,但是MyType它的类型(即静态类型)不是MyType而是类型源自Type(通常为RuntimeType)。如果您意识到PropertyInfo.PropertyType是运行时构造而is是编译时构造(编译器无法知道所表示的类型),这确实很有意义。因此,要解决此问题,您需要使用运行时工具来处理类型数据。

  • 同等输入:

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

    typeof(MyType).IsAssignableFrom(item.PropertyType)
    

旧答案供参考:

我认为你误解了反射是如何工作的,PropertyInfo只代表关于该属性的静态元数据,你不能直接得到它的值,因为如果你考虑它,你有一些缺失的信息:你想从哪个实例得到的属性? PropertyInfo不受任何实例的约束。要获得使用GetValue

所需的值
var value = item.GetValue(instance);