我正在尝试做这样的事情,但反思:
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);
在最后一行我得到一个错误:“对象与目标类型不匹配”
答案 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);