我想一个WinForm注册OnLoad
事件与另一个对象 - 是这样的:拉姆达可以让另一个目的是注入动作
SomeObject.RegisterEvent(action => this.OnLoad += (o,e) => action(o,e));
这可能吗?我不介意在'SomeObject'端创建'helpers'的代理或表达式来执行此操作,但我试图找出我的方法签名甚至看起来像RegisterEvent(...)
。
我想一个WinForm注册OnLoad
事件与另一个对象 - 是这样的:拉姆达可以让另一个目的是注入动作
SomeObject.RegisterEvent(action => this.OnLoad += (o,e) => action(o,e));
这可能吗?我不介意在'SomeObject'端创建'helpers'的代理或表达式来执行此操作,但我试图找出我的方法签名甚至看起来像RegisterEvent(...)
。
的RegisterEvent方法需要看起来像这样:
void RegisterEvent(Action<EventHandler> addEventHandler)
{
addEventHandler((sender, e) =>
{
// loaded
});
}
用法:
someObject.RegisterEvent(handler => { this.OnLoad += handler; });
SomeObject.RegisterEvent(action => { this.OnLoad += (o,e) => {action(o,e);}; });
如果你真的需要有类似的东西(总是一个很好的问题,通常像这样的事情是一个迹象表明有点奇怪的设计,但不一定是),
我想说你应该看看The Reactive Extensions (Rx)...。
他们提供了处理和解雇你自己的'事件'或多或少像属性或方法(并没有代表典型的痛苦,添加/订阅或私人限制等简化了一点)的方便。
...这可能看起来像......
someObjectInstance.MyEvent.Subscribe(d=>
{
// ... your lambda more or less
});
...并在课堂上有,如果只是简单一个Subject<MyEventData> _myEvent;
和_myEvent.OnNext(data)
(去你想从上升的方法内)+物业公开该字段(IObservable<MyEventData> MyEvent {get{return _myEvent;}}
)。
这是你真正想要的。
你可以从NuGet安装它们并在几分钟内使用。虽然对于更棘手的案例有一个学习曲线。
此外,您还可以获得将未来事件与更多事件相结合的好处。
(不是“其中之一”,只是一个非常好的新的技术产品)
对不起,真不明白你正在努力实现..你想构建什么样的架构是什么? – Tigran 2012-04-11 20:52:53