[英]How can I resolve the Class type for generic parameter, when the parameter value is being passed as an interface?
考慮具有以下簽名的方法:
void foo(List<T> myList) ...
假設通過反射,您需要構造這樣的函數並獲取T
類型參數的PropertyInfo
詳細信息。 調用typeof(T).GetProperties(...)
應該可以解決問題,因此我們可以typeof(T).GetProperties(...)
添加到我們的方法中,以獲取這些詳細信息。
void foo(List<T> myList)
{
PropertyInfo[] props =
typeof(T).GetProperties(BindingFlags.Public
| BindingFlags.Instance
| BindingFlags.FlattenHierarchy);
...
}
這提供了我們需要的信息...除了當T
是接口參數時,我發現的是props
僅包含接口屬性,而不包含與列表中的類相關的屬性,該類是從接口繼承的。
明確地說,我的接口和我的類定義是公共的,我的類中的屬性也是公共的。
如何獲得與繼承接口的實際類型關聯的屬性,而不是嚴格地繼承接口屬性?
如果您想要實際的類型,則可能需要為每個項目獲取它:
foreach (T t in myList)
{
Type itemType = t.GetType();
itemType.GetProperties(...)
// etc.
}
您還可以使用以下方法為不同類型添加特定的代碼:
if(itemType == typeof(MyConcreteType))
{
// do specific stuff for that type
}
如果要獲取List<T>
包含的所有對象屬性的平面列表,請使用LINQ解決方案:
IEnumerable<PropertyInfo> properties =
myList.SelectMany(x => x.GetType()
.GetProperties(BindingFlags.Public |
BindingFlags.Instance));
如果需要訪問聲明類型,則始終可以查看PropertyInfo.DeclaryingType
如果您不想使用固定列表,則“ Select
可以執行以下操作:
IEnumerable<PropertyInfo[]> properties =
myList.Select(x => x.GetType()
.GetProperties(BindingFlags.Public |
BindingFlags.Instance));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.