我有以下界面

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/

10-12 04:31