从生成的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?从那里我可以得到属性。

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

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

谢谢。

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

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

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

在我看来,你最好问一个问题,说明为什么你首先有这个属性,以及你想如何使用它。很可能有一个完全不同的替代方案,不需要从实际迭代器的编译器生成的状态机回溯。

相关内容

  • 没有找到相关文章

最新更新