反射调用2种方法

时间:2012-06-28 13:44:56

标签: c# visual-studio-2010 silverlight reflection

我正在尝试做这样的事情,但反思:

var ss1= method1(param).method2();

我知道如何调用第一个方法,但我不知道如何调用第二个方法。

方法1返回一个对象

方法2是GetAwaiter方法(在我的特定情况下)

 MethodInfo mi = typeof(type).GetMethod("method1");
        Type tt = typeof(type);
        ParameterInfo[] param = mi.GetParameters();

        object[] param = new object[] { //some code  };
        object mm= mi.Invoke(this, param);
        MethodInfo mi2 = typeof(type).GetMethod("GetAwaiter");
        var ss1= mi2.Invoke(mm,null);

在最后一行我得到一个错误:“对象与目标类型不匹配”

2 个答案:

答案 0 :(得分:1)

您的代码或多或少是正确的,但该异常告诉您mm不是您认为的那样。 method1返回的类型与.GetMethod(“GetAwaiter”)行中指定的类型不同。

更安全的选择是用mm.GetType()替换typeof(type).GetMethod(“GetAwaiter”)。我怀疑它实际上会返回null,因为mm.GetType()似乎不是你所期望的,但是没有看到更多的代码(特别是'type'是什么以及“method1”和“GetAwaiter”方法是什么实际上已宣布)很难给你更多的指导。

答案 1 :(得分:0)

此行有错误

MethodInfo mi2 = typeof(type).GetMethod("GetAwaiter");

mm对象具有不同的类型,因此您将获得异常。将行更改为

MethodInfo mi2 = mm.GetType().GetMethod("GetAwaiter");
正如蒂姆建议的那样。

最好使用Type.InvokeMember方法,因为它更短,有助于避免这样的错误。例如:

object mResult = this.GetType ().InvokeMember ("method1", 
    BindingFlags.InvokeMethod | BindingFlags.Instance, null, this, 
    new object[] { /* parameters here */ });
object awaiter = mResult.GetType ().InvokeMember ("GetAwaiter",
    BindingFlags.InvokeMethod | BindingFlags.Instance, null, mResult, null);