如何检查变量是否是某种IEnumerable

Ear*_*rlz 44 c# generics ienumerable foreach

基本上我正在构建一个非常通用的T4模板,我需要它做的一件事就是打印variable.ToString().但是,我希望它通过它们来评估列表和foreach,而不是打印ListItem.ToString()My T4模板不知道variable提前的类型,这就是为什么这是如此通用.

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

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

我在标记行上遇到编译器错误"使用泛型类型System.Generic.Collections.IEnumerable需要一个类型参数"

我实际上并不关心它是什么类型,我只是想知道你是否可以通过变量进行预测.我应该使用什么代码?

Cou*_*y D 63

但是你已经接受了一个答案,因为泛型IEnumerable<T>实现了非泛型,IEnumerable你只需要转换为它.

// 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);     
Run Code Online (Sandbox Code Playgroud)

  • 请记住String:IEnumerable <char>.这可能会产生一些意外的结果. (13认同)

Luk*_*keH 21

如果要测试非泛型,IEnumerable那么您需要using System.Collections在源文件的顶部包含一个指令.

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

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


Jos*_*osh 14

其他答案已经指出了通用/非通用的IEnumerable差异,但我还应该指出,你还要特别测试String,因为它实现了IEnumerable,但我怀疑你会把它当作一个字符集来对待.


Tob*_*obi 8

从 C# 7.0 开始,您也可以这样实现:

if (variable is IEnumerable enumVar)
{
    foreach (var e in enumVar)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Sch*_*999 5

好吧,有点简单,但是...如果您只有:

using System.Collections.Generic;
Run Code Online (Sandbox Code Playgroud)

您可能需要添加:

using System.Collections;
Run Code Online (Sandbox Code Playgroud)

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