簡體   English   中英

.NET事件 - 阻止訂閱者訂閱事件

[英].NET events - blocking subscribers from subscribing on an event

假設我有一個暴露事件的“處理器”接口 - OnProcess。 通常,實現者進行處理。 因此,我可以安全地訂閱此事件,並確保它將被解雇。 但是一個處理器不進行處理 - 因此我想阻止訂閱者對其進行處理。 我能這樣做嗎? 換句話說,在下面的代碼中,我希望最后一行拋出異常:

var emptyProcessor = new EmptyProcessor();
emptyProcessor.OnProcess += event_handler; // This line should throw an exception.
class EmptyProcessor : IProcessor {

    [Obsolete("EmptyProcessor.OnProcess should not be directly accessed", true)]
    public event EventHandler OnProcess { 
        add { throw new NotImplementedException(" :( "); }
        remove { }
    }
}

在這種情況下,Obsolete上的true參數會導致編譯時異常。 所以:

EmptyProcessor processor1 = new EmptyProcessor();
IProcessor processor2 = new EmptyProcessor();

processor1.OnProcess += handler;  // <-- compile-time error
processor2.OnProcess += handler;  // <-- run-time error

您可以使用自定義add / remove方法實現它,但我相信這是一個不好的做法。

看,你有一個接口 ,一個由不同類實現的契約
OnProcess是本合同的一部分,並沒有任何特殊之處。

當她想在同一組操作下使用不同的類時,通常使用接口。 接口允許您像這樣編碼:

IProcessor proc = GetProcessorAnyhow ();
proc.DoSomething ();

在編譯類型時不知道具體類型。

但是,按照你的方法,

IProcessor proc = GetProcessorAnyhow ();
proc.OnProcess += (sender, e) => { };

可能會失敗沒有任何明顯的原因,雖然它看起來像絕對合法的代碼。
始終確保錯誤的代碼看起來錯誤

您可能已經完成了以下設計錯誤之一:

  • OnProcess放在IProcessor它可能不是每個處理器的合同 ;
  • EmptyProcessor實現了IProcessor ,但實際上它不能滿足合同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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