c# - 非委托(delegate)类型的事件

标签 c# .net events delegates

我已经实现了一个看起来像这个接口(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)类型

基本上,我需要的是具有addremove 访问器的属性,而不是getset .我认为唯一的方法是使用 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),它会执行 addremove 访问器。


编辑:您可以找到一个弱事件实现 here .
第 2 编辑:或 here .

关于c# - 非委托(delegate)类型的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1134206/

相关文章:

c# - WPF 应用程序 : Controls look like . NET 2.0 中的 WinForms 对话框

javascript - 无法从 HTML 输入元素 ASP.NET 读取 JSON 数据

c# - ClosestIndexOf 的最简单实现

c# - 创建新表单的问题

C# 如何在一天中的特定时间触发事件?

javascript - 组件根上的 Vue 2 事件监听器

c# - 从字符串语句中删除最后一个逗号

c# - 以编程方式关闭 Windows 语音识别的自动化功能?

c# - GridView ButtonField 单击是否会导致回发?

javascript - JavaScript 中的事件检查