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

Adi*_*ter 7 .net c# generics dictionary

我有以下界面

public interface IHandler<T>
{
    void Handle(T myObject);
}
Run Code Online (Sandbox Code Playgroud)

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

例如,我想要的是:

typeof(string)  --> instance of IHandler<string>
typeof(MyClass) --> instance of IHandler<MyClass>
Run Code Online (Sandbox Code Playgroud)

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

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

jas*_*son 10

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

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

Dictionary<Type, object> dictionary;

IHandler<T> Resolve<T>() {
    return (IHandler<T>)dictionary[typeof(T)];
}
Run Code Online (Sandbox Code Playgroud)

泛型没有任何其他方法.

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

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


Jon*_*Jon 5

这与只有通用IHandler<T>接口才能获得的效果一样好.

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

public interface IHandler
{
    void Handler(object myObject);
}
Run Code Online (Sandbox Code Playgroud)

然后,你还可以定义同时实现了一个通用的抽象基类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);
    }
}
Run Code Online (Sandbox Code Playgroud)

此时你可以拥有一个IDictionary<Type, IHandler>,你可以直接调用你从中IHandler.Handle取出的值:

var obj = /* whatever */
dictionary[obj.GetType()].Handle(obj);
Run Code Online (Sandbox Code Playgroud)

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