c# - 如何强制使用订阅方法的事件

标签 c# events event-handling runtime-error

我正在制作一个库,我希望它能在很多地方使用。

在我的界面中,我有一个触发事件的方法。我已经缓存了自己,忘记订阅事件并在程序编译后出错。我很乐意尝试插入用户订阅事件,以便在没有订阅事件的情况下,他们在程序启动前收到编译器错误。

这可能吗?或者 HELP 和 XML 注释是否足以提及用户订阅事件。

我的界面是这样的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Robot.SkolaCa.BusinessObjects;

namespace Robot.SkolaCa.FiskalPrinter
{
    public delegate void OnRacunSuccessEvent(object sender, OnRacunSuccessArgs eargs);
    public delegate void OnRacunErrorEvent(object sender, OnRacunErrorArgs eargs);
    public class OnRacunErrorArgs : EventArgs
    {
        public string ErrorMessage { get; set; }
    }
    public class OnRacunSuccessArgs : EventArgs
    {   
        public string SuccesMessage { get; set; }
    }

    public interface IFiskalPrinter
    {
        bool PresjekStanja();
        bool DnevniIzvjestaj();
        /// <summary>
        /// PLEASE SUBSCRIBE TO ALL EVENTS !!!!
        /// </summary>
        /// <param name="racun"></param>
        void Racun(Racun racun);
        bool StornpRacuna(Racun racun, int brojFiskalnogKojiSeStornira);
        void SetConfig(IPrinterConfig config);
        event OnRacunSuccessEvent OnRacunSuccess;
        event OnRacunErrorEvent OnRacunError;
    }
}

最佳答案

根据定义,事件是兼性的,即如果一个人想要,他/她订阅,如果不订阅——那么这是他/她的权利。通过声明一个事件,你说“如果有人感兴趣,我会通知他一些事件”。因此,强制订阅的整个想法是错误的。

但是如果你需要强制消费者做某事,你最好为你的类消费者声明一个共同接口(interface),并让你的方法接收接口(interface)实现作为参数。例如:

public interface IFiskalPrinterConsumer
{
    void OnRacunSuccess(string successMessage);
    void OnRacunError(string errorMessage);
}

public interface IFiskalPrinter
{
    bool PresjekStanja();
    bool DnevniIzvjestaj();
    void Racun(Racun racun, IFiskalPrinterConsumer consumer);
    bool StornpRacuna(Racun racun, int brojFiskalnogKojiSeStornira);
    void SetConfig(IPrinterConfig config);
}

这样,如果调用者将 null 作为 consumer 传递,您将能够抛出运行时错误,并且调用者将无法取消订阅。这将使您的契约(Contract)更加清晰。您现在是在说“如果您不给我一个监听器对象,我就不会工作”。

然后您可以创建代码分析或 FxCop 规则来检查没有人使用空方法实现来实现接口(interface)。

等等……

但笑话是:如果有人想打破你的规则,他会的。

更新

co-interface 解决方案可能会更好,因为使用 event 您不仅可以拥有 0 个订阅者,还可以拥有 1000 个订阅者。编写 XML 注释说“请确认您始终只有一个订阅”怎么样?你知道,这很难验证。

关于c# - 如何强制使用订阅方法的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624553/

相关文章:

c# - 捕获对 TFS 2012 事件订阅中的工作项所做的所有更改

c# - 获取自应用程序启动以来耗时

c# - DateTimePicker:选择日期和时间

c# - 列出每个对象在 System.Runtime.Caching 内存缓存中占用的大小 c#

vb.net - 组合框事件 : SelectedIndexChanged vs. SelectedValueChanged

apache-flex - 柔性,柔性单元 : How to test that an event is dispatched twice?

c# - 在 .net core api 中不使用模型验证查询参数

jquery - 使用 jQuery.event 检测被单击的链接

python - wxpython事件处理: GetValue after key is pressed

java - 在 Android 中处理事件的最佳方式