我已经实现了一个类,它看起来像这个接口:
[ImmutableObject(true)]
public interface ICustomEvent
{
void Invoke(object sender, EventArgs e);
ICustomEvent Combine(EventHandler handler);
ICustomEvent Remove(EventHandler handler);
ICustomEvent Combine(ICustomEvent other);
ICustomEvent Remove(ICustomEvent other);
}
这个CustomEvent类的工作方式与MulticastDelegate类似。它可以被调用,可以与另一个CustomEvent组合。而且一个CustomEvent可以从另一个CustomEvent中删除。
现在,我想声明一个像这样的类:
class EventProvider
{
public event CustomEvent MyEvent;
private void OnMyEvent()
{
var myEvent = this.MyEvent;
if (myEvent != null) myEvent.Invoke(this, EventArgs.Empty);
}
}
很遗憾,这段代码无法编译。出现了编译器错误CS0066:
“EventProvider.MyEvent”:事件必须是委托类型。
基本上,我需要的是一个具有添加和删除访问器而不是获取和设置访问器的属性。我认为唯一的方法是使用“event”关键字。我知道一个明显的替代方案是声明两个方法来执行添加和删除,但我也想避免这种情况。
是否有人知道有没有好的解决方法?我想知道是否有任何方法可以欺骗编译器接受非委托类型作为事件。也许是自定义属性。
顺便说一下,有人在experts-exchange.com上提出了类似的问题。由于该网站不是免费的,因此我无法查看回复。这是主题:http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21697455.html
IObservable
而不是委托组合/删除模式。后者会在事件被订阅/取消订阅多次时创建不可避免的歧义,需要事件订阅者保持对发布者的强引用以允许取消订阅,即使在其他情况下不需要强引用,也很难保持必要的取消订阅列表等。前者避免了所有这些问题。 - supercat