查找IEnumerable对象的类型

时间:2013-07-01 15:38:40

标签: c#

对于我能做的大多数物体,

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更具描述性呢?

2 个答案:

答案 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)。