我努力为这个问题写一个更合适的'标题' - 当我更好地理解解决方案和正确的术语时,我会尝试清理它。 :D如何通过另一个“聚合对象”在一组相同的对象(相同的类 - 不同的实例)上聚合事件?
有一种模式在我一直在研究的最后两个项目中重复使用(项目都是大量事件驱动的)。
的模式是:
public interface ISourceOfEvents {
event Action<EventInfo1> SomethingHappened1;
event Action<EventInfo2> SomethingHappened2;
{...}
}
public class SingleSourceOfEvents : ISourceOfEvents {
public event Action<EventInfo1> SomethingHappened1 = delegate { };
public event Action<EventInfo2> SomethingHappened2 = delegate { };
{...}
}
public class GroupSourceOfEvents : ISourceOfEvents {
public IList<ISourceOfEvents> SourceOfEventsGroup { get; private set; }
public event Action<EventInfo1> SomethingHappened1 = delegate { };
public event Action<EventInfo2> SomethingHappened2 = delegate { };
{...}
public GroupSourceOfEvents(IList<ISourceOfEvents> sourceOfEventsGroup) {
SourceOfEventsGroup = sourceOfEventsGroup;
foreach (var s in SourceOfEventsGroup) {
s.SomethingHappened1 += x => SomethingHappened1(x);
s.SomethingHappened2 += x => SomethingHappened2(x);
{...}
}
}
}
我的问题归结为“我怎么做出GroupSourceOfEvents
构造自动映射的事件绑定?”。
目前代码很难维护,因为项目中有多个地方需要添加新事件。 ISourceOfEvents
接口允许我将事件添加到中心位置,并且在需要添加事件的任何地方都可以收到编译器错误,但我需要类似的解决方案来处理GroupSourceOfEvents
中的事件绑定器映射 - 或者它是完全动态的。
我想类似这样的东西:
// PSEUDO-CODE WARNING! :D
// PSEUDO-CODE WARNING! :D
// PSEUDO-CODE WARNING! :D
public GroupSourceOfEvents(IList<ISourceOfEvents> sourceOfEventsGroup) {
SourceOfEventsGroup = sourceOfEventsGroup;
var events = typeof(ISourceOfEvents).GetEvents();
foreach (var s in SourceOfEventsGroup) {
foreach (var e in events) {
e.AddEventHandler(s, e.GetRaiseMethod(this));
}
}
}
可以说,我的问题是参数映射到一起。在当前工作代码(顶部示例)中使用了lambda表达式,但我不确定如何使用我在我的伪代码(底部示例)中使用的'样式'技术来实现这一点。另一半的问题是GetRaiseMethod(this)
返回MethodInfo
反对delegate
(这是我需要使用AddEventHandler
),我不知道如何“得到”delegate
。
任何帮助将不胜感激。我也接受不同的模式或方法,可能更标准(如果这不是)。
我使用C#和.NET 4