调用具有动态类型和泛型回调作为参数的泛型非静态方法
本文关键字:泛型 参数 静态方法 回调 动态 类型 调用 | 更新日期: 2023-09-27 18:02:27
使用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
Edit: GetCustomListObject in ServerService:
public void GetCustomListObject<T> (WebRequest request,
RequestStateGen<T>.SuccessfullDelegateType successDelegate,
RequestStateGen<T>.InternalSuccessDelegateType internalSuccessDelegate,
RequestStateGen<T>.ErrorDelegateType errorDelegate)
在您的原始代码中,您正在调用传递委托的方法。
在你的反射代码中,你似乎在传递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 });