我正在制作一个库,我希望它能在很多地方使用。
在我的界面中,我有一个触发事件的方法。我已经缓存了自己,忘记订阅事件并在程序编译后出错。我很乐意尝试插入用户订阅事件,以便在没有订阅事件的情况下,他们在程序启动前收到编译器错误。
这可能吗?或者 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/