T對方法很好,但在Dictionary沒有定義T我不能做的類的情況下不起作用。這可能嗎?如果沒有,是否有另一種方法來完成存盤這樣的通用回呼方法。
此類適用于 Websockets Json-Rpc 客戶端。我連接的 API 允許您訂閱不同的資料流。即股票報價、股票交易等都有不同的領域。
我希望能夠傳入要訂閱的資料的名稱,然后是一個回呼,它是引數型別,一旦回傳,它將傳入資料。
// Store list of callback to invoke once data arrives
private Dictionary<string, Action<T>> _callbacks = new Dictionary<string, Action<T>>();
// Subscribe to websocket API streaming data
public async Task SubscribeAsync<T>(string name, Action<T> callback)
{
_callbacks.Add(name, callback);
... other code here ...
}
// Data is eventually received here from the websocket API
private async Task _wsClient_OnDataReceived(string jsonData)
{
var docRoot = JsonDocument.Parse(jsonData).RootElement;
var deserialzizedData = ...
_callbacks[dataName].Invoke(deserialzizedData);
}
uj5u.com熱心網友回復:
問題是您試圖將多個潛在的多型型別存盤在Dictionary<TKey, TValue>. 但是,字典希望其中的每個專案都具有完全相同的型別。因此,在您的情況下,everyAction<T>必須完全相同,這意味著<T>所有實體的型別必須相同。
但是,如果是介面,則可以解決此問題。例如:
private Dictionary<string, Action<IActionable>> _callbacks = new Dictionary<string, Action<IActionable>>();
IActionable所有型別都實作的一些通用介面在哪里。或者,它不是介面,而是它們都繼承自的公共基類。
無論如何,關鍵是您希望Action<T>保持不變,但以多型方式處理實體。為此,您需要它們實作的介面或具有要呼叫的方法的公共基類。您將把專案作為介面或基類的實體添加到字典中,并通過它們呼叫所需的方法。
uj5u.com熱心網友回復:
這行得通。請注意,SubscribeAsync<T> became SubscribeAsync型別是在第二個引數中傳遞的:
namespace Callbacks {
class SubMgr<T> {
private Dictionary<string, Action<T>> _callbacks = new Dictionary<string, Action<T>>();
public async Task SubscribeAsync(string name, Action<T> callback ) {
_callbacks.Add(name, callback);
_callbacks.Add(name, Method1);
_callbacks.Add(name, Method2);
// ... other code here...
}
public void Method1(T a) { }
public void Method2(T a) { }
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/426694.html
上一篇:如何將泛型型別與1進行比較
