如何统一-centralize-管理来自具有不同CustomEventArgs的提供程序的事件

时间:2012-08-28 17:25:17

标签: c# design-patterns

我正在使用几个不同的提供程序来实现相同的接口,通过对象工厂实例化和访问它们。

我从附加到事件的这些不同提供者处获取数据。这些提供者中的每一个都有自己的CustomEventArgs,它们在提供者之间有所不同......

您能否建议采用“集中”方式管理事件(使用不同的eventArgs)?像铸造事件的东西?以防我想在事件上始终执行相同的操作,例如将字符串属性分配给IU上的Label。

  • 我可以实现类似中间类的东西来监听几个事件(使用不同的eventArgs),然后onEvent可以使用MyOwnEventArgs引发一个新的MyEvent,其中包含来自的几个CustomEventArgs的所有特定属性的总和供应商?对此有什么好处吗?

  • 我可以实现类似中间类的东西来监听几个事件(使用不同的eventArgs)然后onEvent可以使用MyOwnEventArgs引发一个新的MyEvent,它只包含一个IDictionary属性,其中每个Item包含名称和值来自提供商的几个CustomEventArgs的所有特定属性?对此有什么好处吗?

  • 有没有其他方法可以轻松地从多个CustomEventArgs中读取“不同”属性(不同的属性名称)?

1 个答案:

答案 0 :(得分:0)

听起来像是适配器模式的良好匹配,可以将所有不同的事件类转换为您自己的事件类。

如果提供者正确地遵循事件模式,您将在source参数中获得提供者。

所以你可以这样做:

interface IEventAdapter
{
    CustomEventArgs Transform(EventArgs E);
}

public class EventListener
{
    Dictionary<Type, IEventAdapter> _adapters;

    public void Map(Type providerType, IEventAdapter adapter)
    {
        _adapters.Add(providerType, adapter);
    }

    public void Subscribe(IProvider provider)
    {
        //hook event
    }

    protected void OnEvent(object source, EventArgs e)
    {
        var theArgs = _adapters[source.GetType()].Adapt(e);
        TheEvent(source, theArgs);
    }

    public EventHandler<CustomEventArgs> TheEvent;
}