C# 如何使用事件扩展类

C# 如何使用事件扩展类,c#,class,inheritance,events,extension-methods,C#,Class,Inheritance,Events,Extension Methods,我编写了一个库,它实现了第三方协议。此协议遵循发布-订阅模式(通过MQTT)。所以基本上,对于每一条消息,我都有一个发布者方法和一个事件,当某种类型的消息到达时会触发它。现在,出于我的需要,我想用我自己的消息扩展这个协议。但是,我也提出了这两个要求: 仅按照协议体系结构保持基本库的干净 以某种方式用我自己的消息扩展基本库,因此在代码中,您可以在一个类中使用原始消息和我自己的消息 我在考虑两种选择。首先是使用C#扩展方法。我在这个选项中看到的最大优势是,能够在标准协议体系结构中只使用一个类,并

我编写了一个库,它实现了第三方协议。此协议遵循发布-订阅模式(通过MQTT)。所以基本上,对于每一条消息,我都有一个发布者方法和一个事件,当某种类型的消息到达时会触发它。现在,出于我的需要,我想用我自己的消息扩展这个协议。但是,我也提出了这两个要求:

  • 仅按照协议体系结构保持基本库的干净
  • 以某种方式用我自己的消息扩展基本库,因此在代码中,您可以在一个类中使用原始消息和我自己的消息
我在考虑两种选择。首先是使用C#扩展方法。我在这个选项中看到的最大优势是,能够在标准协议体系结构中只使用一个类,并且在需要时,可以使用扩展添加对程序集的引用,并使用扩展库和我的专有消息。不需要重构。另一方面,扩展只是静态方法,不支持事件

我看到的第二个选项是继承一个新类并使用基本库作为基础。这样做的最大优点是,我可以在派生类中做任何我想做的事情。但是,如果在编码之后决定使用扩展库,则需要重构。在这里,我考虑使用与基类相同的名称命名继承的类,但使用不同的名称空间,因此在需要时,可以更改using语句形式

using Hermes
进入

其他一切都应该起作用。但在我看来,这种变通办法似乎有些肮脏

谁能告诉我正确的方法,如何解决这项任务?这方面最好的架构是什么?还有其他我看不到的方法吗

为了供您参考,我还提供了一个来自基本类的片段,它处理一条消息。任何形式的扩展都应该基本相同,只使用我自己的类型

public async Task NotificationOnAsync(NotificationSwitch Payload)
{
    await PublishToBroker(String.Format("hermes/feedback/sound/toggleOn"), Payload.ToJSON());
}

private EventHandler<NotificationSwitchEventArgs> _notificationTurnedOn;
private object _notificationTurnedOnLock = new object();

public event EventHandler<NotificationSwitchEventArgs> NotificationTurnedOn
{
    add
    {
        lock (_notificationTurnedOnLock)
        {
            _notificationTurnedOn += value;
            SubscribeTopic("hermes/feedback/sound/toggleOn");
        }
    }

    remove
    {
        lock (_notificationTurnedOnLock)
        {
            _notificationTurnedOn -= value;
            if (_notificationTurnedOn is null) UnsubscribeTopic("hermes/feedback/sound/toggleOn");
        }
    }
}

protected virtual void OnNotificationTurnedOn(NotificationSwitchEventArgs e)
{
    _notificationTurnedOn?.Invoke(this, e);
}
公共异步任务NotificationAsync(NotificationSwitch有效负载)
{
等待PublishToBroker(String.Format(“hermes/feedback/sound/toggleOn”)、Payload.ToJSON();
}
私有事件处理程序通知已打开;
私有对象_notificationTurnedOnLock=新对象();
公共事件事件处理程序NotificationTurnedOn
{
添加
{
锁定(_notificationTurnedOnLock)
{
_notificationTurnedOn+=值;
SubscribeTopic(“爱马仕/反馈/声音/开关”);
}
}
去除
{
锁定(_notificationTurnedOnLock)
{
_notificationTurnedOn-=值;
如果(_notificationTurnedOn为空)取消订阅主题(“hermes/反馈/声音/切换”);
}
}
}
NotificationTurnedOn上受保护的虚拟无效(NotificationSwitchEventArgs e)
{
_notificationTurnedOn?调用(this,e);
}
谢谢


Jiri

本主题属于正面模式,适合您的情况。本主题属于正面模式,适合您的情况。
public async Task NotificationOnAsync(NotificationSwitch Payload)
{
    await PublishToBroker(String.Format("hermes/feedback/sound/toggleOn"), Payload.ToJSON());
}

private EventHandler<NotificationSwitchEventArgs> _notificationTurnedOn;
private object _notificationTurnedOnLock = new object();

public event EventHandler<NotificationSwitchEventArgs> NotificationTurnedOn
{
    add
    {
        lock (_notificationTurnedOnLock)
        {
            _notificationTurnedOn += value;
            SubscribeTopic("hermes/feedback/sound/toggleOn");
        }
    }

    remove
    {
        lock (_notificationTurnedOnLock)
        {
            _notificationTurnedOn -= value;
            if (_notificationTurnedOn is null) UnsubscribeTopic("hermes/feedback/sound/toggleOn");
        }
    }
}

protected virtual void OnNotificationTurnedOn(NotificationSwitchEventArgs e)
{
    _notificationTurnedOn?.Invoke(this, e);
}