簡體   English   中英

如何通過反思獲得成員的類型?

[英]How do I get the type of a member through reflection?

我需要讀取其名稱傳遞給我的方法的成員(可能是字段或屬性)的值。 這是我檢索MemberInfo的方法:

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

接下來,我想檢查已找到的成員(字段/屬性)的類型。 這樣做的正確方法是什么?

如果是FieldInfo您可以使用PropertyTypePropertyInfoFieldType

MemberInfo member = itemType.GetField(fieldName) as MemberInfo ?? itemType.GetProperty(fieldName) as MemberInfo;
Type type = member is PropertyInfo ? ((PropertyInfo)member).PropertyType : ((FieldInfo)member).FieldType;

使用MemberInfo.MemberType

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

編輯:要獲取屬性字段的數據類型,您還要區分屬性和字段:

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

您可以分別從字段和屬性的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並使代碼更短。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM