如何通过反思获得成员的类型?

时间:2016-03-15 11:25:01

标签: c# reflection

我需要读取其名称传递给my方法的成员(可能是字段或属性)的值。这是我检索MemberInfo的方法:

MemberInfo member = itemType.GetField(fieldName) as MemberInfo ?? itemType.GetProperty(fieldName) as MemberInfo;

接下来,我想检查已找到的成员(字段/属性)的类型。这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

如果| year | month | day | manana | tarde | noche | valor_medida | Score_recogida | |------|-------|-----|--------|-------|-------|--------------|----------------| | 2015 | 4 | 18 | 1 | 0 | 0 | 25.0 | 8.166667 | | 2015 | 4 | 18 | 0 | 0 | 1 | 47.5 | 0.000000 | | 2015 | 4 | 18 | 0 | 1 | 0 | 20.0 | 0.000000 |

,您可以使用PropertyTypePropertyInfo的{​​{1}}属性
FieldType

答案 1 :(得分:1)

使用MemberInfo.MemberType

var myProp = type.GetField(fieldName) ...;
var type = myProp.MemberType;

编辑:要获取属性字段的数据类型,您还要区分属性和字段:

var type = (myProp is PropertyInfo ?) 
    (pyProp as PropertyInfo).PropertyType) : 
    (myProp as FieldInfo).FieldType);

答案 2 :(得分:1)

您可以分别从字段和属性的FieldTypePropertyType属性中获取此信息,但不能(轻松)从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并使代码更短。