从生成的 IEnumerator 类型获取 MethodInfo

问题描述

我正在尝试根据枚举器的实例收集应用于 IEnumerator 方法属性。例如:

static class Program {
    [SomeAttribute("Hello")]
    static IEnumerator test() {
        yield return 1;
        yield return "x";
    }

    static void Main() {
        var foo = test();
        // ... How to get the attribute from the 'foo' instance?
    }
}

foo.GetType() 返回生成的类型Program.<Test>d__4,所以它似乎有点了解生成它的方法。我如何向后工作以找到 Test 的 MethodInfo?从那里我可以获得属性

我还尝试搜索 Program 类型,在每个方法MethodInfo.ReturnType 属性中找到返回 Program.<Test>d__4方法。令我惊讶的是,我想要的 MethodInfo 只指示一个 System.Collections.IEnumerator 返回类型。

也许更了解内部原理的人可以解释我如何从生成的类型中获取 MethodInfo,反之亦然。

谢谢。

解决方法

没有可靠的方法。您可以直接使用反射做的最好的事情是遵循编译器的约定并从生成的类型中提取方法名称和所属类。

一旦编译器重写了迭代器方法,代码就会归入一个与任何其他类一样的类中,并且理论上可以在任何地方被任何其他代码实例化和使用。它实际上从未被任何其他代码使用过是无关紧要的;从代码到实际创建它的代码之间没有任何明确定义的链接。

您的另一个选择是实际反编译程序集中的每个方法,寻找实际上实例化生成类型的方法。这本身就是另一个挑战。 .NET 没有提供一种方便的方法来实现这一点。而且这并不是解决问题的最有效方法,无论问题究竟是什么。

在我看来,通过提出一个问题来说明为什么您首先拥有此属性以及如何使用它会更好地为您服务.很可能有一种完全不同的替代方案,不需要从实际迭代器的编译器生成的状态机进行回溯。