对于我能做的大多数物体,
obj.getType().FullName
但是对于以下代码,
static void Main(string[] args)
{
IEnumerable<int> em = get_enumerable();
Console.WriteLine(em.GetType());
Console.Read();
}
static IEnumerable<int> get_enumerable()
{
for (int i = 0; i < 10; i++)
{
yield return i;
}
}
输出是,
ConsoleApplication1.Program + d__0
ConsoleApplication1是程序集,程序包含类(未显示)。为什么不显示IEnumerable以及如何使GetType更具描述性呢?
答案 0 :(得分:7)
IEnumerable<T>
是开放通用类型。它不是一个实际的类型;它只是一个构造具体(封闭)泛型类型的函数,如IEnumerable<int>
。
IEnumerable<int>
是一个界面;有一个接口的实例是不可能的。
您的迭代器函数实际上返回一个隐藏的编译器生成的类的实例,该类实现IEnumerable<int>
;这就是你从GetType()
看到的。
您想要找到类型IEnumerable<T>
实现的泛型类型参数:
em.GetType().GetInterface("System.Collections.Generic.IEnumerable`1")
.GetGenericArguments()[0]
答案 1 :(得分:2)
IEnumerable
是一个接口,但GetType
将返回表示对象类的System.Type
,而不是它实现的接口。
当您使用yield return
时,C#编译器会自动生成一个新类(在本例中名为ConsoleApplication1.Program+d__0
),它实现IEnumerable<int>
(和IEnumerable
)。