0

私はこのようなことをしようとしていますが、リフレクションがあります:

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

最初のメソッドを呼び出す方法は知っていますが、2 番目のメソッドを呼び出す方法がわかりません。

メソッド 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")に置き換えることです。mm.GetType()は期待どおりではないようですが、コード(特に、「type」とは何か、「method1」メソッドと「GetAwaiter」メソッドはどこにあるか)が表示されないため、実際にはnullが返されると思います。実際に宣言された)あなたにもっと多くのガイダンスを与えるのは難しいです。

于 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 に答える