我需要读取其名称传递给我的方法的成员(它可能是一个字段或属性)的值。这是我如何检索MemberInfo:如何通过反射获得成员的类型?
MemberInfo member = itemType.GetField(fieldName) as MemberInfo ?? itemType.GetProperty(fieldName) as MemberInfo;
接下来,我想检查已找到的成员(字段/属性)的类型。什么是正确的方法来做到这一点?
我需要读取其名称传递给我的方法的成员(它可能是一个字段或属性)的值。这是我如何检索MemberInfo:如何通过反射获得成员的类型?
MemberInfo member = itemType.GetField(fieldName) as MemberInfo ?? itemType.GetProperty(fieldName) as MemberInfo;
接下来,我想检查已找到的成员(字段/属性)的类型。什么是正确的方法来做到这一点?
你可以,如果FieldInfo
MemberInfo member = itemType.GetField(fieldName) as MemberInfo ?? itemType.GetProperty(fieldName) as MemberInfo;
Type type = member is PropertyInfo ? ((PropertyInfo)member).PropertyType : ((FieldInfo)member).FieldType;
使用PropertyInfo
或FieldType
的PropertyType
财产使用MemberInfo.MemberType
var myProp = type.GetField(fieldName) ...;
var type = myProp.MemberType;
编辑:若要获取的数据类型,你必须也区分属性字段属性和字段:
var type = (myProp is PropertyInfo ?)
(pyProp as PropertyInfo).PropertyType) :
(myProp as FieldInfo).FieldType);
实际上,MemberType返回成员是字段,属性还是方法...我需要获取键入(int,string ...)返回的字段或属性,因为我确定它是一个字段或一个属性。 – Simone
所以你确认没有办法直接从'MemberInfo'中取出它?不是我觉得它太奇怪了,因为'MemberInfo'可能指的是很多不同的实体... – Simone
我看不到任何方法来源于MethodInfo。然而,这很清楚,因为'MemberInfo'也可以表示方法和委托。那么在这种情况下,这样的成员应该返回什么?返回值?参数列表? – HimBromBeere
您可以分别从FieldType
和PropertyType
属性中获取此信息,但不能(容易地)从MemberInfo
本身获得该信息。以下是您可以编写代码的一种方式,它有利于代码清晰,并且不会在代码简洁的运行时执行不必要的任务。
void GetInfo(Type itemType, string fieldName) {
FieldInfo field = itemType.GetField(fieldName);
MemberInfo member;
Type memberType;
if (field != null) {
member = field;
memberType = field.FieldType;
} else {
PropertyInfo property = itemType.GetProperty(fieldName);
if (property != null) {
member = property;
memberType = property.PropertyType;
} else {
member = null;
memberType = null;
// or throw an exception
}
}
// do something with member and memberType
}
请注意,如果你只在结尾处不需要memberType
,你可以完全消除member
,使代码更短。
实际上,MemberType返回成员是字段,属性还是方法......我需要获取返回字段或属性的类型(int,string ...),因为我确定它是场或财产。 – Simone
所以你确认没有办法直接从'MemberInfo'中取出它?不是我觉得它太奇怪了,因为'MemberInfo'可能指的是很多不同的实体... – Simone
@Simone不,没有办法。 'MemberInfo'用于其他目的,不会有类型...有一个类型是特定的字段和属性 – Jcl