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>
有没有更好的解决方案或我完全错过的东西?
我怀疑您正在使用它来解决依赖关系。相反,使用一个专门的容器来处理这些问题。
如果你不想这样做,你需要这样的东西:
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);
另一方面,我们现在有了一个额外的接口和一个抽象基类,只是为了隐藏"用户"代码的强制转换,这听起来不太令人印象深刻。