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

本文关键字:gt IHandler lt 之间 映射 | 更新日期: 2023-09-27 18:29:55

我有以下接口

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>

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

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

我怀疑您正在使用它来解决依赖关系。相反,使用一个专门的容器来处理这些问题。

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

Dictionary<Type, object> dictionary;
IHandler<T> Resolve<T>() {
    return (IHandler<T>)dictionary[typeof(T)];
}

泛型没有其他方法。

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

没有,但管理器类通常是代码气味。小心。

这是只使用通用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);

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