C# 反射调用2个方法

C# 反射调用2个方法,c#,visual-studio-2010,silverlight,reflection,C#,Visual Studio 2010,Silverlight,Reflection,我试着做一些类似的事情,但要深思熟虑: var ss1= method1(param).method2(); 我知道如何调用第一个方法,但不知道如何调用第二个方法 方法1返回一个对象 方法2是GetAwaiter方法(在我的特殊情况下) 在最后一行,我得到了一个错误:“对象与目标类型不匹配”您的代码或多或少是正确的,但该异常告诉您mm不是您所认为的。method1返回的类型与在.GetMethod(“GetWaiter”)行中指定的类型不同 更安全的方法是用mm.GetType().GetMe

我试着做一些类似的事情,但要深思熟虑:

var ss1= method1(param).method2();
我知道如何调用第一个方法,但不知道如何调用第二个方法

方法1返回一个对象

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


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

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


更安全的方法是用mm.GetType().GetMethod(“getWaiter”)替换typeof(type)。我怀疑它实际上会返回null,因为mm.GetType()似乎不是您所期望的,但是如果没有看到更多的代码(特别是“type”是什么,以及“method1”和“GetAwaiter”方法实际声明的位置),就很难给您提供更多的指导。

这一行有一个错误

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

这两种方法是同一类型的吗?否则,您需要使用第一个方法返回的类型来获取method2:MethodInfo mi2=mm.GetType().GetMethod(“GetAwaiter”);如果您给出了两个方法(method1+method2)定义(声明,带有返回类型参数),那么就更容易了。我不能把整个代码放进去,因为它太大了。的确,mm.GetType().GetMethod(“GetAwaiter”)是空的。您能给我们“method1”方法的方法签名,并告诉我们“GetAwaiter”是在哪个类中声明的吗?这两种类型必须相同,此代码才能工作。
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);