2010-04-07 55 views
1

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

System.Reflection.TargetException:对象不匹配目标类型。

我与(NUnit的)工作的框架要求我使用反射来执行,所以我必须要提供的城墙内玩耍。我真的不想诉诸于使用Emit来创建动态程序集/模块/类型/方法来执行我已有的委托。

谢谢。

+0

您可以添加产生异常的代码? – dtb 2010-04-07 17:30:54

+0

该代码在NUnit框架中,但当NUnit调用MethodInfo上的Invoke方法时失败。 – 2010-04-07 17:52:39

回答

2

您已经拥有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"); 
    } 
} 
+0

这不适合我。我怀疑NUnit的内部必须有更多的事情发生。我发现了一个解决方法,不过可能是kludgey。他们使所有的方法都是虚拟的,所以我将它传递给MethodInfo,但只是覆盖调用它的方法,并直接调用Action。 – 2010-04-08 10:23:19

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