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)
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,但我怀疑你会把它当作一个字符集来对待.
从 C# 7.0 开始,您也可以这样实现:
if (variable is IEnumerable enumVar)
{
foreach (var e in enumVar)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,有点简单,但是...如果您只有:
using System.Collections.Generic;
Run Code Online (Sandbox Code Playgroud)
您可能需要添加:
using System.Collections;
Run Code Online (Sandbox Code Playgroud)
前者定义IEnumerable<T>
,后者定义IEnumerable
。