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

C# 如何调用从匿名方法创建的MethodInfo?,c#,reflection,delegates,anonymous-methods,nunit-addins,C#,Reflection,Delegates,Anonymous Methods,Nunit Addins,在一个例子中,我问如何从动作委托获得MethodInfo。此操作委托是匿名创建的(来自Lambda)。我现在遇到的问题是无法调用MethodInfo,因为它需要MethodInfo所属的对象。在这种情况下,由于委托是匿名的,因此没有所有者。我得到以下例外情况: System.Reflection.TargetException:对象与目标类型不匹配 我正在使用的框架(NUnit)要求我使用反射来执行,所以我必须在提供的墙内玩。我真的不想使用Emit创建动态程序集/模块/类型/方法来执行我已经拥有

在一个例子中,我问如何从动作委托获得
MethodInfo
。此操作委托是匿名创建的(来自Lambda)。我现在遇到的问题是无法调用
MethodInfo
,因为它需要
MethodInfo
所属的对象。在这种情况下,由于委托是匿名的,因此没有所有者。我得到以下例外情况:

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

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


谢谢。

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


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

解决方案:

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

你能添加生成异常的代码吗?代码在NUnit框架中,但当NUnit调用MethodInfo上的Invoke方法时失败。这对我来说不起作用。我怀疑在努尼特的内部肯定还有更多的事情发生。我找到了一个解决办法,不管它有多麻烦。他们使所有方法都是虚拟的,所以我将MethodInfo传递给它,但只需覆盖调用它的方法,并直接调用操作。
public static void MyMethodInvoker( MethodInfo method, object[] parameters )
{
    if ( method.IsStatic )
        method.Invoke( null, parameters );
    else
        method.Invoke( Activator.CreateInstance( method.DeclaringType ), parameters );
}