代码之家  ›  专栏  ›  技术社区  ›  Michael Meadows

如何调用从匿名方法创建的MethodInfo?

  •  1
  • Michael Meadows  · 技术社区  · 16 年前

    在一个 previous question ,我问如何获得 MethodInfo 来自行动代表。此操作委托是匿名创建的(来自Lambda)。我现在的问题是我不能调用 MethodInfo ,因为它需要一个 MethodInfo 属于。在本例中,由于委托是匿名的,因此没有所有者。我得到了以下例外:

    系统反射TargetException:对象与目标类型不匹配。

    我正在使用的框架(NUnit)要求我使用反射来执行,所以我必须在提供的墙内玩。我真的不想使用 Emit 创建动态程序集/模块/类型/方法只是为了执行我已有的委托。

    谢谢

    2 回复  |  直到 9 年前
        1
  •  3
  •   Hans Passant    16 年前

    您已经获得了Method属性。需要将目标属性作为第一个参数传递给MethodInfo。调用()。

    using System;
    
    class Program {
        static void Main(string[] args) {
            var t = new Test();
            Action a = () => t.SomeMethod();
            var method = a.Method;
            method.Invoke(a.Target, null);
        }
    }
    
    class Test {
        public void SomeMethod() {
            Console.WriteLine("Hello world");
        }
    }
    
        2
  •  0
  •   Matthei    9 年前

    看起来,lambda方法,即使在静态上下文中声明,也被定义为实例方法。

    解决方案:

    public static void MyMethodInvoker( MethodInfo method, object[] parameters )
    {
        if ( method.IsStatic )
            method.Invoke( null, parameters );
        else
            method.Invoke( Activator.CreateInstance( method.DeclaringType ), parameters );
    }