c# - 通用类和接口(interface)的非通用版本

标签 c# generics covariance

我经常发现自己处于创建通用接口(interface)或类然后想以非通用方式使用此类或接口(interface)的不同版本的情况。例如我可能有这样的界面:

interface ICanCreate<T>
{
    T NewObject();
}

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

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

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

    public T Create<T>()
    {            
    }
}

在字典中我使用哪种类型作为我的值?我不知道我是否遗漏了某种设计原则,而且我知道这与 co(ntra?)variance 有很大关系。任何帮助或想法将不胜感激。

最佳答案

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

基本上你想要一个不能用 C# 表达的类型关系——每当这种情况发生时,你最终会得到一个稍微不愉快的解决方案,但看起来你可以在这里隔离丑陋的地方(即将它保留在单个类中) ).

关于c# - 通用类和接口(interface)的非通用版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1005913/

相关文章:

c# - 如何将数据从 texboxes 插入到 datagridview?

C# Language : generics, open/closed, bound/unbound, constructed

c# - JSON 根节点 - 与类名称不同

C++ 通用输出运算符重载

c# - 如何使用 C# 检索网页?

java - 如何使用泛型类型实现接口(interface)?

Java 泛型约束需要像 C# 这样的默认构造函数

python - 在 Python 中构建协方差矩阵

c# - 为什么 List<T> 在协变接口(interface) MyInterface<out T> 上无效

python - 计算 Pandas 时间序列中的协方差