C# 如何通过反射获得成员的类型?
我需要读取一个成员(可能是字段或属性)的值,该成员的名称被传递给我的方法。以下是我检索MemberInfo的方式:C# 如何通过反射获得成员的类型?,c#,reflection,C#,Reflection,我需要读取一个成员(可能是字段或属性)的值,该成员的名称被传递给我的方法。以下是我检索MemberInfo的方式: MemberInfo member = itemType.GetField(fieldName) as MemberInfo ?? itemType.GetProperty(fieldName) as MemberInfo; 接下来,我想检查已找到的成员的类型(字段/属性)。正确的方法是什么?您可以使用PropertyInfo的PropertyType属性,如果FieldInfo
MemberInfo member = itemType.GetField(fieldName) as MemberInfo ?? itemType.GetProperty(fieldName) as MemberInfo;
接下来,我想检查已找到的成员的类型(字段/属性)。正确的方法是什么?您可以使用
PropertyInfo
的PropertyType
属性,如果FieldInfo
MemberInfo member = itemType.GetField(fieldName) as MemberInfo ?? itemType.GetProperty(fieldName) as MemberInfo;
Type type = member is PropertyInfo ? ((PropertyInfo)member).PropertyType : ((FieldInfo)member).FieldType;
如果
FieldInfo
MemberInfo member = itemType.GetField(fieldName) as MemberInfo ?? itemType.GetProperty(fieldName) as MemberInfo;
Type type = member is PropertyInfo ? ((PropertyInfo)member).PropertyType : ((FieldInfo)member).FieldType;
使用
编辑:要获取属性字段的数据类型,还必须区分属性和字段:
var type = (myProp is PropertyInfo ?)
(pyProp as PropertyInfo).PropertyType) :
(myProp as FieldInfo).FieldType);
使用
编辑:要获取属性字段的数据类型,还必须区分属性和字段:
var type = (myProp is PropertyInfo ?)
(pyProp as PropertyInfo).PropertyType) :
(myProp as FieldInfo).FieldType);
您可以分别从字段和属性的
字段类型
和属性类型
属性中获取此信息,但不能(轻松地)从成员信息
本身获取此信息。这里有一种编写代码的方法,它有利于代码的清晰性,并且在运行时不执行不必要的任务,而不是代码的简洁性
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
,并使代码更短。您可以分别从字段和属性的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…),因为我确定它是字段或属性。因此您确认无法直接从MemberInfo
获取它吗?我并不觉得这太奇怪,因为MemberInfo
可能涉及许多不同的实体……我看不到MethodInfo
中有任何方法可以达到这一目的。但是这一点很清楚,因为MemberInfo
也可以表示方法和委托。那么,在这种情况下,这样的成员应该返回什么?返回值是多少?param list?实际上MemberType返回成员是字段、属性还是方法。。。我需要获取返回的字段或属性的类型(int、string…),因为我确定它是字段或属性。因此您确认无法直接从MemberInfo
获取它吗?我并不觉得这太奇怪,因为MemberInfo
可能涉及许多不同的实体……我看不到MethodInfo
中有任何方法可以达到这一目的。但是这一点很清楚,因为MemberInfo
也可以表示方法和委托。那么,在这种情况下,这样的成员应该返回什么?返回值是多少?param list?实际上MemberType返回成员是字段、属性还是方法。。。我需要获取返回的字段或属性的类型(int、string…),因为我确定它是字段或属性。因此您确认无法直接从MemberInfo
获取它吗?我并不觉得这太奇怪,因为MemberInfo
可能涉及很多不同的实体…@Simone不,没有办法MemberInfo
用于其他没有类型的用途。。。类型是字段和属性的特定内容。实际上,MemberType返回成员是字段、属性还是方法。。。我需要获取返回的字段或属性的类型(int、string…),因为我确定它是字段或属性。因此您确认无法直接从MemberInfo
获取它吗?我并不觉得这太奇怪,因为MemberInfo
可能涉及很多不同的实体…@Simone不,没有办法MemberInfo
用于其他没有类型的用途。。。具有类型是字段和属性的特定内容