在进行基于组件的开发时,我发现自己经常这样做:
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/