我有两个类,我想使用反射。
public Class A
{
public string aa { get; set; }
public string bb { get; set; }
...
}
public Class B: A {}
当我试图得到一个B对象的属性时,我没有得到任何属性;
TypeInfo b = typeof(B).GetTypeInfo();
IEnumerable<PropertyInfo> pList = b.DeclaredProperties;
pList总是空的,可能是因为我使用了";DeclaredProperties";而不是GetProproperties(),但在winRt中我不能使用它。
我已经阅读了这个解决方案如何在WinRT中获取类的属性,但我不能使用var properties = this.GetType().GetTypeInfo().GetRuntimeProperties();
,因为GetRuntimeProperties()无法识别
解决方案找到,疑虑依然存在
要获得继承类的属性,我需要以这种方式获得RuntimeProperties
IEnumerable<PropertyInfo> pList = typeof(B).GetRuntimeProperties();
忽略PropertyInfo,如果我尝试获取A对象的属性,它也会起作用
当我读A对象的属性时,getType().GetTypeInfo()
和getType().GetRuntimeProperties()
之间有什么区别?
public string aa;
public string bb;
这些不是属性。属性定义如下:
public string Aa
{
get;
set;
}
有关详细信息,请查阅MSDN上的官方文档。
一旦您对类A
和B
进行了更正,您就可以使用:
var classProperties = typeof(B).GetTypeInfo().DeclaredProperties;
对于B类中定义的属性,以及:
var allProperties = typeof(B).GetRuntimeProperties();
对于在类和的继承树中定义的属性;即在运行时实际可访问的属性(因此是方法的名称)。
如果您不想将public
字段更改为属性(但确实应该更改),请对typeof(B)
使用GetRuntimeFields
方法,对typeof(B).GetTypeInfo()
使用DeclaredMembers
方法以获得类似的行为。