0

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

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);

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

4

2 回答 2

1

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

更安全的选择是将 typeof(type) 替换为 mm.GetType().GetMethod("GetAwaiter")。我怀疑这实际上会返回 null,因为 mm.GetType() 似乎不是您所期望的,但没有看到更多代码(特别是“类型”是什么以及“method1”和“GetAwaiter”方法在哪里实际声明)很难给你更多的指导。

于 2012-06-28T13:59:46.147 回答
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);
于 2012-06-28T14:18:02.927 回答