4

对于我能做的大多数事情,

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.程序+d__0

其中 ConsoleApplication1 是程序集,而 Program 包含类(未显示)。为什么它不显示 IEnumerable 以及如何使 GetType 对这种情况更具描述性?

4

2 回答 2

7

IEnumerable<T>是一个开放的泛型类型。它不是一个实际的类型。它只是一个构造具体(封闭)泛型类型的函数,例如IEnumerable<int>.

IEnumerable<int>是一个接口;不可能有一个接口的实例。

您的迭代器函数实际上返回一个隐藏的编译器生成的类的实例,该类实现IEnumerable<int>; 这就是你所看到的GetType()

您想找到类型IEnumerable<T>实现的泛型类型参数:

em.GetType().GetInterface("System.Collections.Generic.IEnumerable`1")
            .GetGenericArguments()[0]
于 2013-07-01T15:41:52.620 回答
2

IEnumerable是一个接口,但GetType将返回System.Type表示对象的类,而不是它实现的接口。

当您使用yield return时,C# 编译器会自动生成一个ConsoleApplication1.Program+d__0实现IEnumerable<int>(and ) 的新类(在本例中命名IEnumerable)。

于 2013-07-01T15:42:30.250 回答