1

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

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

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

谢谢。

4

2 回答 2

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");
    }
}
于 2010-04-07T17:34:11.480 回答
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 );
}
于 2017-03-16T22:15:21.950 回答