我有以下界面
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>
。
有没有更好的解决方案或我完全错过的东西?
答案 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);
另一方面,我们现在有一个额外的接口和一个抽象基类,只是为了隐藏来自“用户”代码的演员,这听起来不太令人印象深刻。