在设置属性时更换事件的最优雅方法是什么?

Ale*_*x J 1 c# events components event-handling

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有更优雅的方式来做这个事件"换出"?

(当然,如果foo是不可变的话,可以避免整个问题,但是我不会得到任何视觉设计师的支持.)

Ree*_*sey 5

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


如果你想缩短代码,因为你做了很多,你可以创建一个方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

if (value != foo) 
{
    SwapEventHandler(value,foo, (o) => o.SomeEvent += foo_SomeEvent, (o) => o.SomeEvent -= foo_SomeEvent );
    foo = value;
}
Run Code Online (Sandbox Code Playgroud)