C# .NET事件-阻止订阅服务器订阅事件

C# .NET事件-阻止订阅服务器订阅事件,c#,events,hook,overriding,subscribe,C#,Events,Hook,Overriding,Subscribe,假设我有一个“处理器”接口,它公开了一个事件进程。通常由实现者进行处理。因此,我可以安全地订阅此事件,并确保它将被触发。但是一个处理器不做处理——因此我想阻止订阅者使用它。我可以这样做吗?换句话说,在下面的代码中,我希望最后一行抛出异常: var emptyProcessor = new EmptyProcessor(); emptyProcessor.OnProcess += event_handler; // This line should throw an exception. 在这种

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

var emptyProcessor = new EmptyProcessor();
emptyProcessor.OnProcess += event_handler; // This line should throw an exception.
在这种情况下,过时上的
true
参数会导致编译时异常。因此:

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

processor1.OnProcess += handler;  // <-- compile-time error
processor2.OnProcess += handler;  // <-- run-time error
EmptyProcessor processor1=新的EmptyProcessor();
IPProcessor Processor 2=新的EmptyProcessor();

processor1.OnProcess+=处理程序;// 您可以使用自定义的
add
/
remove
方法来实现它,但我认为这是一种糟糕的做法

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

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

IProcessor proc = GetProcessorAnyhow ();
proc.DoSomething ();
不知道编译类型的具体类型

但是你的做法,

IProcessor proc = GetProcessorAnyhow ();
proc.OnProcess += (sender, e) => { };
可能会在没有任何明显原因的情况下失败,尽管它看起来是绝对合法的代码。

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

  • OnProcess
    放入
    i处理器
    中,而它可能不是每个处理器的合约
  • 使
    EmptyProcessor
    实现
    IProcessor
    ,但实际上它不能满足合同要求

哇。。。我甚至不知道你能做到。我刚刚编写了一个快速的示例应用程序来测试它,谁知道呢。。。成功了。非常有趣。+1,尽管我不确定此异常消息是否会非常有用;)我同意这个想法是草率的。但即使在BCL中,NotSupportedException也有很多用途。。。但我坚定地认为,没有什么是100%的“有害的”(不,甚至不是GOTO)
NotSupportedException
是可以的。但人们很难猜测,仅仅订阅该活动就会导致它。假设此代码通过库公开。事件订阅者怎么会知道
+=
会抛出异常,特别是在通过接口处理类时?想象一下,您是被指派来找出代码崩溃原因的人。你能看看这行有没有错误吗?
IProcessor proc = GetProcessorAnyhow ();
proc.OnProcess += (sender, e) => { };