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)
泛型没有任何其他方法.
有没有更好的解决方案或我完全错过的东西?
不,但经理类通常是代码味道.小心.
这与只有通用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)
另一方面,我们现在有一个额外的接口和一个抽象基类,只是为了隐藏"用户"代码的演员,这听起来不是很令人印象深刻.