2012-09-29 45 views
6

我想這樣做如何檢查泛型方法的類型T是否爲IEnumerable <>並將其循環?

void DoSomething<T>(T param) 
{ 
    if param is IEnumerable<?> 
    { 
     loop param and do stuff 
    } 
} 

我不知道該怎麼在問號的地方做。這有可能嗎?

+0

如果'param'不是'IEnumerable '類型,你想做什麼嗎?如果沒有,爲什麼不把'T'限制爲'IEnumerable '與[where](http://msdn.microsoft.com/zh-cn/library/bb384067.aspx)? –

+0

可能的答案在這裏: http://stackoverflow.com/questions/1846671/determine-if-collection-is-of-type-ienumerablet –

+0

在堆棧溢出後回答[點擊這裏] [1] [1]:http://stackoverflow.com/questions/906499/getting-type-t-from-ienumerablet –

回答

7

你所尋找的是:

if (T is IEnumerable) { .. } 

,但如果你指望噸至是IEnumerable的一切的時候,你可以這樣做:

void DoSomething<T>(T param) where T : IEnumerable 
{ 
    foreach (var t in param) { ... } 
} 

或檢查值的類型了IEnumerable內:

​​

不用擔心自己檢查一下,編譯器會爲你做,它是具有靜態類型系統和編譯器的好東西一個:)

+0

我認爲他實際上試圖檢查特定類型的IEnumerable,而不僅僅是一般的IEnumerable。問題下注釋中的鏈接處理該場景 –

+0

好點。不適用這種情況下完成答案,謝謝。 –

+0

謝謝你的回覆。問題是我不希望T始終是IEnumerable 。實際上,我已經有了一個'void ProcessList (IEnumerable list)'的方法,如果參數是一個IEnumerable,我們希望在'DoSomething()'中重用它。 – tranmq

0

有幾種方法:

void DoSomething<T>(T param) 
{ 
    if (param is IEnumerable) 
    { 
     foreach (var item in (IEnumerable)param) 
     { 
      // Do something 
     } 
    } 
} 

void DoSomething<T>(T param) 
{ 
    if (param is IEnumerable<string>) 
    { 
     foreach (var item in (IEnumerable<string>)param) 
     { 
      // Do something 
     } 
    } 
} 

void DoSomething<T,TItem>(T param) 
{ 
    if (param is IEnumerable<TItem>) 
    { 
     foreach (var item in (IEnumerable<TItem>)param) 
     { 
      // Do something 
     } 
    } 
} 
+0

最佳做法是使用'as'而不是'is'-plus-direct-cast,昂貴的運行時類型只檢查一次,而is-plus-direct-cast則檢查兩次。 – phoog

0

你必須檢查的開放式泛型類型的每個接口的這個類實現,像所以:

bool implements = typeof(T).GetInterfaces().Where(t => t.IsGenericType && 
    t.GetGenericTypeDefinition() == typeof(IEnumerable<>)).Any(); 

這將允許您確定類型是否實現IEnumerable<T>實際上不知道什麼類型T是。請記住,該類型可以多次執行IEnumerable<T>

如果您只需要類型參數爲IEnumerable<T>的類型序列,則可以將上述查詢更改爲;

IEnumerable<Type> types = typeof(T).GetInterfaces(). 
    Where(t => t.IsGenericType && 
     t.GetGenericTypeDefinition() == typeof(IEnumerable<>)). 
    Select(t => t.GetGenericArguments()[0]); 
+0

多次實現'IEnumerable '的類型確實是一種令人恐懼的類型。 – phoog

相關問題