T - >之间的映射; IHandler <T> </T>

时间:2012-04-03 11:17:36

标签: c# .net generics dictionary

我有以下界面

public interface IHandler<T>
{
    void Handle(T myObject);
}

我希望有一个HandlersManager类,它包含对象类型与相应处理程序之间的映射,但我不确定我应该如何定义保存此映射的对象。

例如,我想要的是:

typeof(string)  --> instance of IHandler<string>
typeof(MyClass) --> instance of IHandler<MyClass>

到目前为止,我得到的最好的事情是为映射定义Dictionary<Type, object>,但在这种情况下,每次我得到它时,我都必须将值转换为IHandler<T>

有没有更好的解决方案或我完全错过的东西?

2 个答案:

答案 0 :(得分:10)

我怀疑你是用它来解决依赖关系的。相反,请使用专门的容器来处理这些问题。

如果你不想这样做,你需要这样的东西:

Dictionary<Type, object> dictionary;

IHandler<T> Resolve<T>() {
    return (IHandler<T>)dictionary[typeof(T)];
}

仿制药没有其他办法。

  

有没有更好的解决方案或我完全错过的东西?

不,但经理类通常是代码味道。小心。

答案 1 :(得分:5)

只有通用的IHandler<T>接口才能获得它。

为了探索更多选项,我们可以定义一个非泛型版本的界面:

public interface IHandler
{
    void Handler(object myObject);
}

然后你还可以定义一个实现IHandler<T>IHandler的通用抽象基类:

public abstract class BaseHandler<T> : IHandler, IHandler<T>
{
    public abstract void Handle(T myObject);

    void IHandler.Handle(object myObject)
    {
        ((IHandler<T>)this).Handle((T) myObject);
    }
}

此时您可以拥有IDictionary<Type, IHandler>,并且可以直接致电IHandler.Handle了解您提取的值:

var obj = /* whatever */
dictionary[obj.GetType()].Handle(obj);

另一方面,我们现在有一个额外的接口和一个抽象基类,只是为了隐藏来自“用户”代码的演员,这听起来不太令人印象深刻。