我已经实现了一个看起来像这个接口(interface)的类:
[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': 事件必须是委托(delegate)类型
基本上,我需要的是具有add 和remove 访问器的属性,而不是get 和set .我认为唯一的方法是使用 event 关键字。我知道一个明显的替代方法是声明两个方法来执行添加和删除操作,但我也想避免这种情况。
有人知道这个问题是否有好的解决方案吗?我想知道是否有任何方法可以欺骗编译器接受非委托(delegate)类型作为事件。也许是自定义属性。
顺便说一句,有人在experts-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 委托(delegate),它会执行 add
和 remove
访问器。
关于c# - 非委托(delegate)类型的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1134206/