7

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

4

3 回答 3

9

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

于 2010-03-23T20:38:44.427 回答
9

查看方法的属性,并查看方法是否使用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.

于 2010-03-23T20:27:47.943 回答
5

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

<(\w|_)+>b_.+
于 2010-03-23T20:37:01.260 回答