【问题标题】:How do I invoke a MethodInfo that was created from an anonymous method?如何调用从匿名方法创建的 MethodInfo?
【发布时间】:2010-04-07 17:25:18
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 能否添加产生异常的代码?
  • 代码在NUnit框架中,但是当NUnit调用MethodInfo上的Invoke方法时失败。

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


【解决方案1】:

您已经获得了 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");
    }
}

【讨论】:

  • 这对我不起作用。我怀疑 NUnit 的内部肯定还有更多的事情要做。我找到了一种解决方法,但它可能很笨拙。他们把所有的方法都变成了虚拟的,所以我把 MethodInfo 传递给它,但只是重写了调用它的方法,然后直接调用 Action。
【解决方案2】:

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

解决方案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2011-02-04
    • 2013-05-08
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多