在previous question中,我询问了如何从Action委托中获取MethodInfo
。此Action代理是匿名创建的(来自Lambda)。我现在遇到的问题是我无法调用MethodInfo
,因为它需要MethodInfo
所属的对象。在这种情况下,由于代表是匿名的,因此没有所有者。我得到以下例外:
System.Reflection.TargetException:Object与目标类型不匹配。
我正在使用的框架(NUnit)要求我使用Reflection来执行,所以我必须在提供的墙内玩。我真的不想使用Emit
创建动态程序集/模块/类型/方法来执行我已经拥有的委托。
感谢。
答案 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 );
}