簡體   English   中英

當參數值作為接口傳遞時,如何解析通用參數的Class類型?

[英]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.

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