如何检查一个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<>)