如何检查一个variables是否是某种IEnumerable

基本上我正在build立一个非常通用的T4模板,我需要做的事情之一是打印variable.ToString() 。 但是,我希望它评估列表和foreach通过他们,而不是打印ListItem.ToString()我的T4模板不知道什么types的variable会提前,这就是为什么这是通用的。

但是我生成的当前代码如下所示:

 if(variable!=null) if(variable is IEnumerable) //error here foreach(var item in variable) Write(item.ToString()); 

我得到一个编译器错误标记为“使用genericstypesSystem.Generic.Collections.IEnumerable需要一个types参数”

实际上我并不关心它是什么types的,我只是想知道你是否可以通过variables进行foreach。 我应该使用什么代码?

但是,您已经接受了一个答案,因为genericsIEnumerable<T>实现了非genericsIEnumerable您可以将其转换为此types。

 // Does write handle null? Might need some sanity aswell. var enumerable = variable as System.Collections.IEnumerable; if (enumerable != null) foreach(var item in enumerable) Write(item); else Write(item); 

如果要testing非genericsIEnumerable则需要在源文件的顶部包含一个using System.Collections指令。

如果你想testing某种IEnumerable<T> ,那么你需要这样的东西:

 if (variable != null) { if (variable.GetType().GetInterfaces().Any( i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>))) { // foreach... } } 

其他的答案指出了generics/非generics的IEnumerable的区别,但我也应该指出,你也将要testingstring专门,因为它实现IEnumerable,但我怀疑你会想把它作为一个字符的集合。

一般来说 ,在没有非generics基types/接口的情况下,这需要GetType和通过基types/接口进行recursion查找。

但是 ,这并不适用于此:-)只需使用通用IEnumerable ( System.Collections.Generic.IEnumerable<T> )inheritance的非genericsIEnumerable ( System.Collections.IEnumerable )。

那么,有点简单,但是…如果你只有:

 using System.Collections.Generic; 

您可能需要添加:

 using System.Collections; 

前者定义IEnumerable<T> ,后者定义IEnumerable

这是一个老问题,但我想显示一个确定SomeType是否为IEnumerable的替代方法:

 var isEnumerable = (typeof(SomeType).Name == "IEnumerable`1"); 

你可以直接testing任何generics的基类。

 instance.GetGenericTypeDefinition() == typeof(IEnumerable<>)