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

时间:2010-04-07 17:25:18

标签: c# reflection delegates anonymous-methods nunit-addins

previous question中,我询问了如何从Action委托中获取MethodInfo。此Action代理是匿名创建的(来自Lambda)。我现在遇到的问题是我无法调用MethodInfo,因为它需要MethodInfo所属的对象。在这种情况下,由于代表是匿名的,因此没有所有者。我得到以下例外:

  
    

System.Reflection.TargetException:Object与目标类型不匹配。

  

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

感谢。

2 个答案:

答案 0 :(得分:3)

您已获得Method属性。您需要将Target属性作为第一个参数传递给MethodInfo.Invoke()。

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");
    }
}

答案 1 :(得分:0)

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

解决方案:

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