我努力爲這個問題寫一個更合適的'標題' - 當我更好地理解解決方案和正確的術語時,我會嘗試清理它。 :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