使用反射获取类型

12

我正在尝试使用反射获取我的类的属性类型,但它只返回了RuntimePropertyInfo - 作为类型的名称。

我有一个名为MyObject的对象actualData - 它包含"名称"作为字符串的属性和"Item"作为我的类型DatumType。

当我调试时,我可以看到actualData有2个属性,第一个是字符串类型,第二个是DatumType,但当我使用这个:

string typeName = actualData.GetType().GetProperty("Item").PropertyType.Name - 它返回给我RuntimePropertyInfo,而不是DatumType

你能看到我做错了什么吗?我正在使用C# - .Net 4.0。 非常感谢!


C# 是大小写敏感的。你在问题中提到的内容可能并不是你实际尝试过的。 - user743382
你在开玩笑吗?:D 不,那肯定不是问题。 - Martin Ch
2
我并没有说那是问题所在。你注意到我将这个作为注释而不是答案了吗?但是如果你不包括你实际尝试过的代码,我们就只能猜测你尝试的是否仅仅是修复了大小写,还是有其他更改。 - user743382
2
如果有问题出现在大小写方面,难道你不认为编译器会告诉我吗?或者如果属性名称有问题的话,它会返回空异常 - Martin Ch
3
如果你没有包含输入给编译器的代码,我怎么知道编译器告诉你什么,需要你提供代码。为了让我理解清楚,请提供相关代码。 - user743382
3个回答

16

你正在获取getProperty()返回的PropertyInfo对象的类型。尝试:

string typeName = actualData.getType().getProperty("Item").PropertyType.Name;

如果您想获取通过 PropertyInfo 对象当前分配给对象的值的类型,可以调用:

string typeName = actualData.getType().getProperty("Item").GetValue(actualData, null).GetType().Name;

但是在那种情况下,你也可以直接调用:

string typeName = actualData.Item.GetType().Name;

它只返回“Object”作为类型名称。 - Martin Ch
1
该属性可能被定义为 object 类型,但它有一个赋值为 DatumType 的值。GetProperty 只会返回所定义的类型,而不是当前值的类型。任何类型都可以分配给 object 类型的属性。您应该使用 PropertyInfo 并在其上调用 GetValue() 来获取已分配值的类型。 - C.Evenhuis
那么有没有办法获取这种类型呢?因为如果我在实际数据上进行调试,我可以看到Item是DatumType,只有反射会返回其他东西。 - Martin Ch
谢谢,它运行得很好! :) 我无法调用 actualData.Item.GetType().Name,因为 actualData 可能是另一个类的实例,该类不包含 Item 属性,所以我必须使用反射来完成,但再次感谢! - Martin Ch

2

The

actualData.getType().getProperty("Item")

获取类型为PropertyInfo的某些内容。

如果您要求其类型,则:

actualData.getType().getProperty("Item").getType()

你得到的正是你观察到的。

我认为最后的getType()是不必要的。

编辑:有人对这个答案进行了投票,我认为这是不公平的。问题是“你能看出我做错了什么吗?”,而回答中多使用了一个getType,这是正确的。如果询问者知道自己做错了什么,那么在PropertyInfo中找到PropertyType就很容易了。

对于那位对这个答案进行了投票的人:下次请至少留下评论。Stackoverflow只有我们互相学习,而不是互相抨击时才有意义。


1

GetType() 方法总是返回当前对象的类型,而不是指向的对象。

在您的情况下,考虑使用 string typeName = actualData.getType().getProperty("Item").PropertyType.Name


不起作用。例如,如果属性是 Nullable(Of Date) 类型,则返回 "Nullable`1"。仅适用于字符串属性。 - Pachanka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接