0

Xamarin/Mono を使用した Android (およびそれ以降の iOS) 用アプリの開発。通常、このコードを使用して非静的ジェネリック メソッドを呼び出すと、うまく機能します。

serverService.GetCustomListObject<T> (firstRequestInLine,
                                      null,
                                      onGetCustomListObjectFromThread<T>,
                                      onGetCustomListObjectFromThreadError); 

コールバックは次のように定義されます。

private void onGetCustomListObjectFromThread<T> (List<T> list, 
                                                 RequestStateGen<T>.SuccessfullDelegateType successDel
{ ... }

private void onGetCustomListObjectFromThreadError (String error,
                                                   WebRequest failedRequest)
{ ... }

ただし、動的に設定されているGetCustomListObject<t>場所を呼び出す必要があります。t私はジェネリックにはまったく慣れていませんが、他の例から次のコードを試してみましたが、成功しませんでした:

typeof(ServerService).GetMethod ("GetCustomListObject").MakeGenericMethod (t).Invoke (serverService, new object[] {
        firstRequestInLine,
        null,
        typeof(LocalServerService).GetMethod ("onGetCustomListObjectFromThread").MakeGenericMethod (t),
        typeof(LocalServerService).GetMethod ("onGetCustomListObjectFromThreadError")
        });

ここにLocalServerServiceある私のすべての例が含まれているクラスはどこserverServiceですかServerService

次のエラーが表示されます。

Error: Ambiguous matching in method resolution

編集: ServerService の GetCustomListObject:

public void GetCustomListObject<T> (WebRequest request,
                                    RequestStateGen<T>.SuccessfullDelegateType successDelegate,
                                    RequestStateGen<T>.InternalSuccessDelegateType internalSuccessDelegate,
                                    RequestStateGen<T>.ErrorDelegateType errorDelegate)
4

1 に答える 1

1

元のコードでは、デリゲートを渡すメソッドを呼び出していました。

リフレクションコードでは、代わりに値を渡しているように見えます。MethodInfo値が自動的にデリゲートに変換されるとは思いません。

残念ながら、メソッドの宣言を知らずに適切なコードサンプルを提供することは困難ですが、次のようなものGetCustomListObjectが必要です。

Type thirdArgType = typeof(Foo<>).MakeGenericGenericType(t);
MethodInfo thirdArgMethod = typeof(LocalServerService)
                                .GetMethod("onGetCustomListObjectFromThread",
                                           BindingFlags.Instance | BindingFlags.NonPublic)
                                .MakeGenericMethod(t);
Delegate thirdArg = Delegate.CreateDelegate(thirdArgType, this, thirdArgMethod);

MethodInfo fourthArgMethod = typeof(LocalServerService)
                                 .GetMethod("onGetCustomListObjectFromThreadError",
                                            BindingFlags.Instance | BindingFlags.NonPublic);
Delegate fourthArg = Delegate.CreateDelegate(typeof(Bar), this, fourthArgMethod);

MethodInfo method = typeof(ServerService).GetMethod("GetCustomListObject")
                                         .MakeGenericMethod (t);
method.Invoke(serverService,
    new object[] {firstRequestInline, null, thirdArg, fourthArg });
于 2013-03-06T13:22:20.670 に答える