我正在尝试使用反射来迭代我的一个类中的所有属性:
public MDInstrument() : base()
{
PropertyInfo[] properties = typeof(MDInstrument).GetProperties();
foreach (PropertyInfo item in properties)
{
var tick = item as TickData;
}
}
当我检查var属性时,我可以正确地看到所有属性
但在线:
var tick = item as TickData;
我收到错误:
ADDITION
嗨感谢您的反馈。我不是想要获得价值。代码在构造函数中。我试图循环类中的对象,如果它们是类型' TickData'然后我想将它们添加到列表中。我这样做是通过使用as关键字尝试强制转换。我一定错过了什么。
答案 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属性。请注意,您不能在运行时类型元数据上使用as
和is
。如果你写
var isType = item.Type is MyType;
你总是得到false
,因为虽然item.Type
代表某种类型,但是MyType
它的类型(即静态类型)不是MyType
而是类型源自Type(通常为RuntimeType
)。如果您意识到PropertyInfo.PropertyType
是运行时构造而is
是编译时构造(编译器无法知道所表示的类型),这确实很有意义。因此,要解决此问题,您需要使用运行时工具来处理类型数据。
同等输入:
item.PropertyType == typeof(MyType)
typeof(MyType).IsAssignableFrom(item.PropertyType)
旧答案供参考:
我认为你误解了反射是如何工作的,PropertyInfo只代表关于该属性的静态元数据,你不能直接得到它的值,因为如果你考虑它,你有一些缺失的信息:你想从哪个实例得到的属性? PropertyInfo
不受任何实例的约束。要获得使用GetValue:
var value = item.GetValue(instance);