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>wheret动态设置。我对泛型很陌生,但尝试了其他示例中的以下代码但没有成功:

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 回答