2010-02-17 246 views
8

假設我有一個「處理器」接口暴露事件 - OnProcess。通常執行者進行處理。因此,我可以安全地訂閱此事件並確保它將被解僱。但是一個處理器不會處理 - 因此我想阻止訂閱者對其進行討論。我可以這樣做嗎?在下面的代碼換句話說,我想最後一行拋出一個異常:.NET事件 - 阻止訂閱者訂閱事件

var emptyProcessor = new EmptyProcessor(); 
emptyProcessor.OnProcess += event_handler; // This line should throw an exception. 
+0

想象一下,您是分配給人以查明代碼崩潰原因的人。你會在這條線上尋找錯誤嗎? –

回答

8
class EmptyProcessor : IProcessor { 

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

在這種情況下,對過時的true參數將導致編譯時異常。所以:

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

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

非常感謝你 – Moshe

+0

哇......我甚至不知道你能做到這一點。我剛寫了一個快速示例應用程序來測試它,誰知道它的工作。很有意思。 – Nick

+0

+1,雖然我不確定這個異常消息是否會非常有幫助;) –

0

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

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

當她想要在同一組操作下工作時,通常會使用接口。接口允許你這樣編碼:

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

不知道編譯類型的具體類型。

但是,你們的做法,

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

可能會失敗,沒有任何明顯的原因,雖然它看起來像合法的絕對代碼。
Always make sure that wrong code looks wrong

你可能已經做了以下設計錯誤之一:

  • OnProcessIProcessor它可能不是每個處理器的合同;
  • 製造EmptyProcessor實施IProcessor,而實際上它不能滿足合同