8

假设我有一个公开事件的“处理器”接口 - OnProcess。通常由实施者进行处理。因此,我可以安全地订阅此事件并确保它会被触发。但是一个处理器不进行处理 - 因此我想阻止订阅者订阅它。我可以这样做吗?换句话说,在下面的代码中,我希望最后一行抛出异常:

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

2 回答 2

8
class EmptyProcessor : IProcessor {

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

在这种情况下,trueObsolete 上的参数会导致编译时异常。所以:

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

processor1.OnProcess += handler;  // <-- compile-time error
processor2.OnProcess += handler;  // <-- run-time error
于 2010-02-17T17:44:38.863 回答
0

您可以使用自定义add/remove方法来实现它,但我认为这是一种不好的做法。

看,你有一个接口,一个由不同类实现的契约。
OnProcess是本合同的一部分,在任何方面都没有特别之处。

当她想在同一组操作下使用不同的类时,通常会使用接口。接口允许您编写如下代码:

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

在编译类型时不知道具体类型。

但是,根据您的方法,

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

可能会在没有任何明显原因的情况下失败,尽管它看起来绝对是合法的代码。
始终确保错误的代码看起来是错误的。

您可能犯了以下设计错误之一:

  • 投入虽然它可能不是每个OnProcess处理器的合同IProcessor
  • 做了EmptyProcessor实施IProcessor,实际上不能满足合同
于 2011-03-04T21:23:28.067 回答