簡體   English   中英

訂閱作為方法參數傳遞的委托

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM