我认为你必须在这里实现一个好的发布者/订阅者。我的建议是这样的:
您的发布者:EventAggregator 应该有如下方法:
public void Register(IEventObserver observer, EventFilter filter)
public void Unregister(IEventObserver observer)
你的IEventObserver 应该是这样的
public interface IEventObserver
{
void Notify(object eventSource, DetailedEventArgs e);
}
你的订阅者应该实现这个接口。
您的EventFilter 类应该具有您打算使用的所有过滤属性。
这个类可以有这样的方法:
public bool IsSatisfiedBy(DetailedEventArgs e)
并创建一个名为DetailedEventArgs 的类并从EventArgs 继承它,将您想要的有关事件的所有详细信息放在上面。
在Register 方法中,您应该同时存储过滤器和观察器。现在当你的EventAggregator 捕捉到一个事件时,它应该首先从接收到的事件中创建DetailedEventArgs 对象,然后循环观察者及其过滤器以查看对象是否满足过滤器,如果满足,则调用 Notify 方法原始发送者和DetailedEventArgs对象的观察者。
我强烈建议您检查发布方而不是订阅方的过滤器。因为在订阅者端签入会导致大量代码重复和不一致。
编辑:EventFilter 和 DetailedEventArgs 类的示例:
public class EventFilter
{
private List<Type> SourceTypes;
private List<EventType> EventTypes;
public EventFilter() : this(new Type[] { }, new EventType[] { }) { }
public EventFilter(IEnumerable<Type> sourceTypes, IEnumerable<EventType> eventTypes)
{
SourceTypes = new List<Type>(sourceTypes);
EventTypes = new List<EventType>(eventTypes);
}
public void AddSourceType(Type type)
{
AddItemToList(SourceTypes, type);
}
public void AddEventType(EventType type)
{
AddItemToList(EventTypes, type);
}
private void AddItemToList<T>(List<T> list, T item)
{
lock (list)
{
if (!list.Contains(item))
list.Add(item);
}
}
public bool IsSatisfiedBy(DetailedEventArgs args)
{
return SourceTypes.Contains(args.Source.GetType()) && EventTypes.Contains(args.EventType);
}
}
public class DetailedEventArgs : EventArgs
{
public EventArgs SourceArgs { get; private set; }
public object Source { get; private set; }
public EventType EventType { get; private set; }
public DetailedEventArgs(object source, EventArgs sourceArgs, EventType eventType)
{
Source = source;
SourceArgs = sourceArgs;
EventType = eventType;
}
}
public enum EventType
{
EventType1,
EventType2,
EventType3
}
希望我能帮上忙 :)