我在這里遺漏了一些東西。我會盡可能清楚。
假設我有這個方法:
public Task<CustomClass> TestMethod(string one, string two, int three)
{
throw new NotImplementedException();
}
我想創建一個通用方法,它采用這些方法(通過委托)并做一些事情。
所以假設我有一個帶有委托和通用方法的類:
public static class SomeClass
{
public delegate T CallbackMethodDelegate<T>(params object[] args);
public static void InvokeMethod<T>(CallbackMethodDelegate<Task<T>> method, params object[] args) where T: class
{
method.Invoke(args);
}
}
我的理解是 T 可以是一個類,所以我應該能夠在代碼的某個地方做到這一點:
SomeClass.InvokeMethod<CustomClass>(TestMethod, "one", "two", 3);
但我得到編譯錯誤
CS1503:Argument 1: cannot convert from 'method group' to 'SomeClass.CallBackMethodDelegate<Task<CustomClass>>'
我認為這可能是一個異步的事情,但即使我將委托更改為 void 我也會得到同樣的錯誤。有什么我想念的想法嗎?似乎我在這里誤解了關于委托或泛型的重要內容。謝謝大家。
uj5u.com熱心網友回復:
因為錯誤表明您的方法與委托不兼容。委托需要object[]作為引數,您的方法有 3 個string,string,int不兼容的顯式引數。
如果你真的需要,你可以做的是創建一組涵蓋各種方法的呼叫方法:
void InvokeMethod<TResult>(Func<Task<TResult>> method, TParam1 param1)
void InvokeMethod<TParam1, TResult>(Func<TParam1,Task<TResult>> method, TParam1 param1)
void InvokeMethod<TParam1,TParam2, TResult>(Func<TParam1, TParam2 ,Task<TResult>> method, TParam1 param1, TParam2 param2)
等等,你需要有多少引數。
您可以將這些方法簡化為非型別安全但無法直接訪問的單個實作
void InvokeMethodImpl(Delegate method, params object[] args)
=> method.DynamicInvoke(args);
所以所有泛型方法都會呼叫這個方法:
void InvokeMethod<TParam1, TResult>(Func<TParam1,Task<TResult>> method, TParam1 param1)
=> InvokeMethodImpl(method, param1);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/482086.html
上一篇:TypeScript泛型型別A是Class而B是實作Interface<A>的類
下一篇:...args的泛型型別?
