【问题标题】:How to identify anonymous methods in System.Reflection如何识别 System.Reflection 中的匿名方法
【发布时间】:2010-03-23 20:25:07
【问题描述】:

如何通过反射识别匿名方法?

【问题讨论】:

  • 你能多说一些你想要完成的事情吗?

标签: c# reflection anonymous-methods


【解决方案1】:

查看方法的属性,看方法是否用CompilerGeneratedAttribute修饰。

匿名方法(以及其他对象,例如自动实现的属性等)将添加此属性。


例如,假设您的班级有一个类型。匿名方法将在:

Type myClassType = typeof(MyClass);
IEnumerable<MethodInfo> anonymousMethods = myClassType
    .GetMethods(
          BindingFlags.NonPublic
        | BindingFlags.Public 
        | BindingFlags.Instance 
        | BindingFlags.Static)
    .Where(method => 
          method.GetCustomAttributes(typeof(CompilerGeneratedAttribute)).Any());

这应该返回在MyClass 上定义的任何匿名方法。

【讨论】:

  • 任何其他方法(或成员/类型)也可以。
  • True - 您可以在任何方法上手动定义它,然后欺骗它,但通常,它用于匿名方法和其他编译器生成的信息。
  • 也适用于自动属性,以及属性 getter 和 setter。
  • 当然,这不是一种故障安全的方法,因为没有“匿名”之类的东西,但“匿名”通常意味着编译器生成的类型。
  • @Leppie:我刚刚更改了语言 - 有帮助吗?
【解决方案2】:

你不能,因为在 IL 级别上没有匿名方法之类的东西——它们都是命名的,并且都属于命名类型。而且 C# 和 VB 编译器将匿名方法转换为命名方法和类型的方式完全是实现定义的,不能依赖(这意味着,例如,它可以随着任何更新而改变,即使在次要版本/修补程序中也是如此)。

【讨论】:

  • +1:从技术上讲,这是“正确”的答案 - 但 [CompilerGenerated] 在实践中相当可靠。
【解决方案3】:

据我所知,正则表达式模式是:

<(\w|_)+>b_.+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2011-02-27
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多