【问题标题】:Getting MethodInfo from a generated IEnumerator type从生成的 IEnumerator 类型中获取 MethodInfo
【发布时间】:2021-07-09 17:08:39
【问题描述】:

我正在尝试根据枚举器的实例收集应用于 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,反之亦然。

谢谢。

【问题讨论】:

    标签: c# reflection attributes ienumerator methodinfo


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 2010-12-04
      相关资源
      最近更新 更多