[英]Subscribe to a delegate that was passed as method argument
我試圖將循環編程模式構建到通用類中以供代碼重用。 此模式的一部分在異步操作過程中根據需要安全地訂閱/取消訂閱委托(多播委托用作事件)。
以下代碼無法編譯。 我面臨的問題是C#允許我將委托作為方法參數傳遞,但是在MyWorker類內部的任何地方,subscribe + =,-=操作都會導致錯誤。 (從外部對同一個代表正常工作)。
[Operator '+=' cannot be applied to operands of type 'delegateT' and 'method group']
語法錯誤? 委托范圍限制? 這是語言所不允許的嗎?
public class MyWorker<delegateT,argT>
{
private delegateT mDelegate;
public MyWorker(delegateT d)
{
mDelegate = d; //save delegate (reference?) for use later
}
public void DoWorkAsync()
{
mDelegate += m_subscriber; //ERROR: Operator '+=' cannot be applied to operands of type 'delegateT'...
//...Do some work that causes delegate to fire...
mDelegate -= m_subscriber; //ERROR: Operator '-=' cannot be applied to operands of type 'delegateT'...
}
private void m_subscriber(argT arg)
{
Console.WriteLine("Received: " + arg.ToString());
}
}
注意,泛型似乎不是原因。 我試過使用靜態類型,但結果相同。 我還嘗試通過傳遞帶有'ref'關鍵字的委托來確保我正在存儲和引用原始對象,而不是本地副本...可能是次要問題,但每次僅一步。
[更新]
OIC,無法約束委托類型似乎是這里的主要問題,並妨礙了我使用通用方法。 感謝您指出羅恩。
為了闡明原始意圖:
我將委托用於內部事件; 比嚴格的“事件”類型更具靈活性。 我正在尋找某種在運行時將委托(ref?)傳遞給MyWorker類的方法。 然后,MyWorker執行一些后台任務,這些任務將根據需要訂閱和取消訂閱,以在操作期間接收事件,然后最終退出進行垃圾回收。 我為30多個幾乎相同的任務/事件執行此操作,這就是為什么非常需要創建可重用(泛型?)類的原因。
我系統中的代表具有嚴格的形式,例如:
delegate void delegateEvent1(Class1 arg);
delegate void delegateEvent2(Class2 arg);
...
delegate void delegateEventN(ClassN arg);
計划B將通過Action委托從MyWorker內部進行訂閱和取消訂閱。 這有點麻煩,因為它需要為每個調用創建2個Actions <>,而不僅僅是干凈地傳遞所需的委托。
歡迎任何建議...
這不是因為您為通用參數delegateT
命名的,編譯器知道它是某種委托類型,所以它不知道該類型上存在+ =運算符。 實施此操作需要一些通用約束; 但是AFAIK在C#中是不可能的
正如KiwiPiet在評論中指出的那樣,您可以嘗試為某些委托類型添加約束
正如羅恩·拜爾(Ron Beyer)在評論中指出的那樣,也不可能限制某些委托人類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.