我想這樣做如何檢查泛型方法的類型T是否爲IEnumerable <>並將其循環?
void DoSomething<T>(T param)
{
if param is IEnumerable<?>
{
loop param and do stuff
}
}
我不知道該怎麼在問號的地方做。這有可能嗎?
我想這樣做如何檢查泛型方法的類型T是否爲IEnumerable <>並將其循環?
void DoSomething<T>(T param)
{
if param is IEnumerable<?>
{
loop param and do stuff
}
}
我不知道該怎麼在問號的地方做。這有可能嗎?
你所尋找的是:
if (T is IEnumerable) { .. }
,但如果你指望噸至是IEnumerable的一切的時候,你可以這樣做:
void DoSomething<T>(T param) where T : IEnumerable
{
foreach (var t in param) { ... }
}
或檢查值的類型了IEnumerable內:
不用擔心自己檢查一下,編譯器會爲你做,它是具有靜態類型系統和編譯器的好東西一個:)
我認爲他實際上試圖檢查特定類型的IEnumerable,而不僅僅是一般的IEnumerable。問題下注釋中的鏈接處理該場景 –
好點。不適用這種情況下完成答案,謝謝。 –
謝謝你的回覆。問題是我不希望T始終是IEnumerable 。實際上,我已經有了一個'void ProcessList
有幾種方法:
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
}
}
}
最佳做法是使用'as'而不是'is'-plus-direct-cast,昂貴的運行時類型只檢查一次,而is-plus-direct-cast則檢查兩次。 – phoog
你必須檢查的開放式泛型類型的每個接口的這個類實現,像所以:
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]);
多次實現'IEnumerable
如果'param'不是'IEnumerable '類型,你想做什麼嗎?如果沒有,爲什麼不把'T'限制爲'IEnumerable '與[where](http://msdn.microsoft.com/zh-cn/library/bb384067.aspx)? –
可能的答案在這裏: http://stackoverflow.com/questions/1846671/determine-if-collection-is-of-type-ienumerablet –
在堆棧溢出後回答[點擊這裏] [1] [1]:http://stackoverflow.com/questions/906499/getting-type-t-from-ienumerablet –