C# 如何通过反射获得成员的类型?

C# 如何通过反射获得成员的类型?,c#,reflection,C#,Reflection,我需要读取一个成员(可能是字段或属性)的值,该成员的名称被传递给我的方法。以下是我检索MemberInfo的方式: MemberInfo member = itemType.GetField(fieldName) as MemberInfo ?? itemType.GetProperty(fieldName) as MemberInfo; 接下来,我想检查已找到的成员的类型(字段/属性)。正确的方法是什么?您可以使用PropertyInfo的PropertyType属性,如果FieldInfo

我需要读取一个成员(可能是字段或属性)的值,该成员的名称被传递给我的方法。以下是我检索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;
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
用于其他没有类型的用途。。。具有类型是字段和属性的特定内容