.NET事件 – 阻止订阅者订阅事件

假设我有一个暴露事件的“处理器”接口 – OnProcess。 通常,实现者进行处理。 因此,我可以安全地订阅此事件,并确保它将被解雇。 但是一个处理器不进行处理 – 因此我想阻止订户对其进行处理。 我能这样做吗? 换句话说,在下面的代码中,我希望最后一行抛出exception:

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参数会导致编译时exception。 所以:

 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 ,但实际上它不能满足合同