1

我正在尝试根据枚举器的实例收集应用于 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()返回生成的 type Program.<Test>d__4,所以它似乎对生成它的方法有所了解。如何向后工作以找到 MethodInfo Test?从那里我可以得到属性。

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

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

谢谢。

4

1 回答 1

1

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

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

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

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

于 2021-04-14T16:44:57.387 回答