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是不可变的话,可以避免整个问题,但是我不会得到任何视觉设计师的支持.)
我认为你当前的实现是完全可以接受的.它非常清晰易懂.
如果你想缩短代码,因为你做了很多,你可以创建一个方法:
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)