c# - 有没有办法达到通过引用传递 "event"的效果?

标签 c# .net events delegates anonymous-methods

我将“事件”放在引号中,因为我意识到它是一些语法糖,而不是真正的类型。

我有一些事件只是链接到另一个类中的匹配事件。所以当事件被引发时,段落就像

发起者 -> 代理 -> 订阅者

所以在 Proxy 类中我有一个像这样的常见模式:

Raiser.SomeEvent += 
    (_, args) =>
    {
        if (this.SomeEvent != null)
            this.SomeEvent(this, args);
    };

为了整理我的代码,我想将其移至另一个方法,该方法返回包装上述事件调用代码的新委托(delegate):

public static EventHandler GetHandlerDelegate(EventHandler handler, Object sender)
{
    return
        (_, args) =>
        {                
            if (handler != null)
                handler(sender, args);
        };
    }      

然后在代理中我可以这样做:

Raiser.SomeEvent += GetHandlerDelegate(this.SomeEvent, this);

这更加整洁。

只要订阅者在上述调用之后不决定订阅 Proxy.SomeEvent 就可以了。不幸的是,我并没有像我希望的那样通过引用传递“事件”;我现在明白我只是传递调用列表,因此当 OtherClass.SomeEvent 发生并且匿名方法被调用并调用它所给出的“事件”(委托(delegate))时,只有具有的委托(delegate)添加到该事件在我调用 GetHandlerDelegate() 时将被调用。虽然这实际上足以满足我目前的情况,但以这种方式编码确实是 Not Acceptable 。

我读过其他一些 SO 问题,我发现有一种叫做“ react 性扩展”的东西可能会有所帮助,但目前我正在寻找一种更简单的解决方案(如果有)。 (如果没有,我就不会这样做。)

有没有其他方法可以完成我正在尝试做的事情,而没有上述缺点?


如果这个问题不清楚,请参阅my answer希望这有助于澄清它。

最佳答案

编辑:好的,我想我现在明白了。其实很简单。您应该能够编写代理以仅拥有一个事件,然后使代理本身订阅 Raiser 的事件,如下所示(仅针对 EventHandler - 我稍后会介绍):

Proxy proxy = new Proxy();
raiser.SomeEvent += Proxy.Handler;

// Then in the subscriber...
proxy.ProxiedEvent += (whatever)

// And the proxy class...
public class Proxy
{
    public event EventHandler ProxiedEvent;

    public void Handler(object sender, EventArgs e)
    {
        EventHandler proxied = ProxiedEvent;
        if (proxied != null)
        {
            // Or pass on the original sender if you want to
            proxied(this, e);
        }
    }
}

现在,这里的困难是让它正常工作。尽管我现在有些心烦意乱,但我目前想不出任何方法可以做到这一点。

这是您正在考虑的事情吗?或者它至少可以帮助您以不同的方式思考问题吗?

关于c# - 有没有办法达到通过引用传递 "event"的效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7086103/

相关文章:

c# - 带有 iTextSharp 的 PDF 表单

C# 调用方法类/接口(interface)( native 代码、成本)

c# - 有没有一种简单的方法来制作类的不可变版本?

javascript - HTML5 音频 : Using both oncanplay and oncanplaythrough events for audio

c# - 忽略排队的鼠标事件

c# - 使用 "private set;"阻止其他类添加到列表

c# - 有什么方法可以知道用户离开了 asp.net 的页面吗?

c# - 为什么会在不同时间调用 LostFocus 事件?

c# - 箱线图工具提示可见性

javascript - 如何离线和在线运行 Web 应用程序(在 .NET 中)