通用类和接口的非通用版本

Jac*_*yan 9 c# generics covariance

我经常发现自己处于一种情况,我创建了一个通用接口或类,然后想要以非通用的方式使用这个类或接口的不同版本.例如,我可能有这样的界面:

interface ICanCreate<T>
{
    T NewObject();
}
Run Code Online (Sandbox Code Playgroud)

这允许类成为该类型的工厂.然后我想用一般的工厂类注册这些,所以我尝试写这样的东西:

public class Factory
{
    private Dictionary<Type, ICanCreate> mappings; // what do I put here????

    public void RegisterCreator<T>(ICanCreate<T> creator)
    {            
    }

    public T Create<T>()
    {            
    }
}
Run Code Online (Sandbox Code Playgroud)

在字典中我使用哪种类型的价值?我不知道我是否缺少某种设计原则,我知道这与co(ntra?)方差有很大关系.任何帮助或想法将不胜感激.

Jon*_*eet 11

你要么只是object在你的字典声明中使用它(它都是私有的,可以验证你永远不会把错误的东西放在那里)或声明一个扩展的非泛型ICanCreate接口ICanCreate<T>.

基本上你想要一个无法在C#中表达的类型关系 - 无论何时发生这种情况,你最终会得到一个稍微不愉快的解决方案,但看起来你可以在这里孤立丑陋(即将它保持在单个类中).

  • 是否有任何成员可以合理地放入非通用接口?如果接口是*just*Create方法,那么我会坚持使用对象 - 非泛型接口实际上不会给你任何东西.在其他情况下,您可能只能参考您不知道正确类型参数的非泛型接口,在这种情况下,这提供了明显的好处. (2认同)