C# 与C的协方差#

C# 与C的协方差#,c#,covariance,C#,Covariance,我在c代码中遇到了一些有趣的协方差问题 我有一个通用的矩阵类,它被实例化为矩阵,矩阵和矩阵 对于我的业务逻辑,我已经将它们包装到一个通用的包装器中。此包装器实现非泛型INonGenericWrapper接口。所以,我有Wrapper,Wrapper和Wrapper 我的问题是:我想为所有这3个包装器定义一个容器。我不能说List,因为我不能将Wrapper插入此集合。我甚至不能说List,因为在我的foreach中,我想访问genericMatrix参数 俗气的部分:此包装将使用明确的类型进行(

我在c代码中遇到了一些有趣的协方差问题

我有一个通用的
矩阵
类,它被实例化为
矩阵
矩阵
矩阵

对于我的业务逻辑,我已经将它们包装到一个通用的
包装器中。此包装器实现非泛型
INonGenericWrapper
接口。所以,我有
Wrapper
Wrapper
Wrapper

我的问题是:我想为所有这3个
包装器定义一个容器。我不能说
List
,因为我不能将
Wrapper
插入此集合。我甚至不能说
List
,因为在我的foreach中,我想访问generic
Matrix
参数

俗气的部分:此包装将使用明确的类型进行(反)序列化:
MySerializer.Serialize(_myInstanceOfWrappedApple)

我认为很明显,在序列化时,我希望避免巨大的
typeof
切换

我可能的解决办法是什么?我有点卡住了


提前感谢,

您已经说过希望能够基于协变公开类型将数据插入到集合中。这根本不可能。对于协变类型,它不需要公开任何插入数据的方法。类型需要是逆变的才能支持这一点,但是如果类型是逆变的,那么它就不能在协变庄园中公开信息


简而言之,这是不可能的,不仅因为C#作为一种语言已经实现了什么,而且在概念层面上也是不可能的。用任何可能的语言都不可能实现这个问题的静态类型解决方案。

最近我遇到了这样的限制,我实现了的一个变体(可能是滥用)。但这帮助我解决了问题

我不是建筑师,只是个开发者。所以,如果我滥用设计模式,请原谅,但这肯定会有所帮助

根据提供的信息,我创建了类的模拟,并应用了访问者模式,如下所示

public class Matrix<T>
{
    public T Obj { get; set; }
}

public interface INonGenericWrapper
{
    void Wrap();
    void Accept(IVisitor visitor);
}

public class Wrapper<T> : INonGenericWrapper
{
    public Matrix<T> Matrix { get; private set; }

    public void Wrap()
    {
        //Your domain specific method
    }

    public void Accept(IVisitor visitor)
    {
        visitor.Visit(this);
    }
}

public interface IVisitor
{
    void Visit<T>(T element);
}

public class SerializationVisitor : IVisitor
{
    public void Visit<T>(T element)
    {
        new Serializer<T>().Serialize(element);
    }
}

public class Serializer<T>
{
    public Stream Serialize(T objectToSerialize)
    {
        Console.WriteLine("Serializing {0}", objectToSerialize);
        //Your serialization logic here
        return null;
    }
}

所有类型的序列化程序逻辑都相同吗?还是不同?你能发布一些伪代码来说明这一点吗?根据我的理解,我已经回答了你的问题,看看这是否有帮助。如果没有,请说明。
List<INonGenericWrapper> wrappers = new List<INonGenericWrapper>();
wrappers.Add(new Wrapper<object>());
wrappers.Add(new Wrapper<string>());
wrappers.Add(new Wrapper<int>());
var visitor = new SerializationVisitor();//Create the operation you need to apply
foreach (var wrapper in wrappers)
{
    wrapper.Accept(visitor);
}
Serializing Wrapper`1[System.Object]
Serializing Wrapper`1[System.String]
Serializing Wrapper`1[System.Int32]