查找IEnumerable对象的类型

cou*_*que 4 c#

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

obj.getType().FullName
Run Code Online (Sandbox Code Playgroud)

但对于以下代码,

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;
            }
        }
Run Code Online (Sandbox Code Playgroud)

输出是,

ConsoleApplication1.Program + d__0

ConsoleApplication1是程序集,程序包含类(未显示).为什么它不显示IEnumerable,如何使GetType更具描述性?

SLa*_*aks 7

IEnumerable<T>是一种开放的通用类型.它不是一个实际的类型; 它只是一个构造具体(封闭)泛型类型的函数IEnumerable<int>.

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

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

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

em.GetType().GetInterface("System.Collections.Generic.IEnumerable`1")
            .GetGenericArguments()[0]
Run Code Online (Sandbox Code Playgroud)