c# - 设置属性时换出事件的最优雅方法是什么?

标签 c# events event-handling components

在进行基于组件的开发时,我发现自己经常这样做:

public class SomeClass
{
    SomeOtherClass foo;

    public SomeOtherClass Foo
    {
        get { return foo; }
        set {
            if (value != foo) {
                if (value != null) {
                    // subscribe to some events
                    value.SomeEvent += foo_SomeEvent;
                }

                if (foo != null) {
                    // unsubscribe from subscribed events
                    foo.SomeEvent -= foo_SomeEvent;
                }

                foo = value;
            }
        }
    }

    void foo_SomeEvent(object sender, EventArgs e)
    {
        // do stuff
    }
}

有没有更优雅的方式来做这个事件“交换”?

(当然,如果 foo 是不可变的,整个问题就可以避免,但那样我就得不到任何可视化设计器的支持。)

最佳答案

我确实认为您当前的实现是完全可以接受的。它非常清晰易懂。


如果你想缩短代码,因为你经常这样做,你可以创建一个方法来完成它:

private void SwapEventHandler<T>(T a, T b, Action<T> subscribe, Action<T> unsubscribe)
    where T : class
{
    if (a != null) 
        subscribe(a);
    if (b != null)
        unsubscribe(b);
}

然后你可以写:

if (value != foo) 
{
    SwapEventHandler(value,foo, (o) => o.SomeEvent += foo_SomeEvent, (o) => o.SomeEvent -= foo_SomeEvent );
    foo = value;
}

关于c# - 设置属性时换出事件的最优雅方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1521869/

相关文章:

javascript:窗口外的事件

javascript - 带有 useState 钩子(Hook)的 React 功能组件立即执行函数

java - 在fabric8 Kubernetes客户端events()API中,Watcher.Action指示什么?

c# - 'johny.Form 1' does not contain a definition for ' Form1_Load'

c# - NPOI - 获取 excel 行数以检查它是否为空

c# - 双缓冲用户控件的刷新问题

events - 每个微服务的 CQRS 事件源和自己的数据库

c# - 使用文本框调用 C#

C# 找不到 namespace 名称

c# - Control.Enabled 是如何工作的?