我已经实现了一个看起来像这个接口的类:
[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':事件必须是委托类型
基本上,我需要的是一个添加和删除访问器而不是get和set的属性.我认为唯一的方法就是使用event关键字.我知道一个明显的替代方案是声明两个可以进行添加和删除的方法,但我也想避免这种情况.
有谁知道这个问题是否有一个很好的解决方案?我想知道是否有任何方法可以欺骗编译器接受非委托类型作为事件.也许是自定义属性.
顺便说一句,有人在expert-exchange.com上提出了类似的问题.由于该网站不是免费的,我看不到回复.以下是主题:http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21697455.html
试试这个:
CustomEvent myEvent public event EventHandler MyEvent { add { myEvent = myEvent.Combine(value); } remove {myEvent = myEvent.Remove(value); } }
您可以向其添加和删除正常的EventHandler委托,它将执行add
和remove
访问器.
编辑:你可以在这里找到一个弱事件实现.
2 次编辑:或者在这里.