2016-09-23 148 views
0

在下面的示例中,我有一個稱爲GetList的方法,它接受一個字符串參數並返回一個List實體。我在一個通用的IEnumerable變量中捕獲它,因爲在運行時我不知道用戶可能需要什麼實體。我如何使用實際的類型而不是對象?IEnumerable變量類型

我要取代這個...

IEnumerable<object> data = GetList(entityName); 

有了這個...

IEnumerable<Company> data = GetList(entityName); 

我能想到的處理是正確的,現在該我不打算這樣做的唯一途徑因爲我們有300多個實體是一樣的東西

switch(entitName) 
{ 
    case "Company": 
    IEnumerable<Company> data = GetList(entityName); 
    break; 

    case "Employee": 
    IEnumerable<Employee> data = GetList(entityName); 
    break; 

    ... 
} 
+0

'GetList(entityName).Cast ()' –

+0

雖然我不知道它會是公司。它可能是員工或角色等..我唯一的信息是一個字符串(entityName)表示他們想要查詢的實體。 – jjf1978

+0

那麼,在這種情況下,你應該保持你的對象。編譯器也不會爲你知道。你將不得不做出一些類型的猜測來知道你正在使用什麼類型。或者您需要向我們提供代碼執行的環境,以便我們找到解決方法。 –

回答

2

你不能在符合的代碼中使用這種類型 - 所以真的沒有辦法在沒有反射的情況下創建它。

最接近你可以得到你似乎想要的是IEnumerable<dynamic>所以你可以基於他們的運行時類型訪問對象的屬性。

如果您只是需要創建強類型枚舉以返回其他代碼,那麼其效果會比IEnumerable<object>更好,您可以使用反射來創建此類型(Create generic List<T> with reflection)。與其說這是直接使用MakeGenericMethod用正確的類型(How do I use reflection to call a generic method?)後,通過反射調用它

您可能還可以有訪問結果在強類型的方式,但通用功能。

+1

謝謝!真正的答案,而不是snark :) – jjf1978

0

您可以GetList()通用:

IEnumerable<Company> data = GetList<Company>(entityName); 

IEnumerable<T> GetList<T>(string entityName) 
{ 
    List<T> list = new List<T>(); 

    // Populate list here 

    return list; 
} 
+0

我不能指定typ因爲我所要做的只是一個字符串。最終用戶單擊一個將字符串返回給我的應用程序的列表,然後應用程序必須獲取該實體。所以我不能硬編碼GetList jjf1978

+2

如果你不知道任何關於它的事情,你如何期望對你回來的列表做任何有意義的事情? – itsme86

+0

這正是問題所在。關於我所能做的與返回列表是databind它。我可以使用反射來痛苦地看所有的屬性,但我真的不想這樣做......基本上我想要一個變量類型 – jjf1978