我需要讀取其名稱傳遞給我的方法的成員(它可能是一個字段或屬性)的值。這是我如何檢索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