我有以下界面
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>
。有没有更好的解决方案或我完全错过的东西?
最佳答案
这与仅使用通用 IHandler<T>
接口(interface)所能获得的一样好。
为了探索更多选项,我们可以定义接口(interface)的非通用版本:
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);
另一方面,我们现在有一个额外的接口(interface)和一个抽象基类,只是为了隐藏“用户”代码的强制转换,这听起来并不令人印象深刻。
关于c# - T --> IHandler<T> 之间的映射,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9992159/