正在查找IEnumerable对象的类型
本文关键字:类型 对象 IEnumerable 查找 | 更新日期: 2023-09-27 18:20:45
对于我能做的大多数对象,
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;
}
}
输出为,
控制台应用程序1.程序+d__0
其中ConsoleApplication1是程序集,Program包含类(未显示)。为什么它不显示IEnumerable?我如何使GetType对这种情况更具描述性?
IEnumerable<T>
是一个开放泛型类型。它不是一个实际的类型;它只是一个构造具体(封闭)泛型类型(如IEnumerable<int>
)的函数。
IEnumerable<int>
是一个接口;不可能有一个接口的实例。
迭代器函数实际上返回了一个隐藏的编译器生成的类的实例,该类实现了IEnumerable<int>
;这就是你从GetType()
中看到的。
您想要找到类型的IEnumerable<T>
实现的泛型类型参数:
em.GetType().GetInterface("System.Collections.Generic.IEnumerable`1")
.GetGenericArguments()[0]
IEnumerable
是一个接口,但GetType
将返回代表对象类的System.Type
,而不是它实现的接口。
当您使用yield return
时,C#编译器会自动生成一个新类(在本例中称为ConsoleApplication1.Program+d__0
),该类实现IEnumerable<int>
(和IEnumerable
)。