与C#的协方差

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

我有一个通用的Matrix类,它已被实例化,例如MatrixMatrixMatrix

对于我的业务逻辑,我将它们Wrapper成通用的Wrapper 。 此Wrapper实现非通用的INonGenericWrapper接口。 所以,我有WrapperWrapperWrapper

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

俗气的部分:这个Wrappers将使用明确的类型(de-)序列化: MySerializer<Wrapper>.Serialize(_myInstanceOfWrappedApple)

我认为很明显我想在序列化时避免大量的typeof开关..

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

提前致谢,

最近我遇到了这样的限制,我实现了访客模式的变化(可能是滥用它)。 但这帮助我解决了这个问题。

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

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

 public class Matrix { public T Obj { get; set; } } public interface INonGenericWrapper { void Wrap(); void Accept(IVisitor visitor); } public class Wrapper : INonGenericWrapper { public Matrix 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 element); } public class SerializationVisitor : IVisitor { public void Visit(T element) { new Serializer().Serialize(element); } } public class Serializer { public Stream Serialize(T objectToSerialize) { Console.WriteLine("Serializing {0}", objectToSerialize); //Your serialization logic here return null; } } 

如何使用:

 List wrappers = new List(); wrappers.Add(new Wrapper()); wrappers.Add(new Wrapper()); wrappers.Add(new Wrapper()); var visitor = new SerializationVisitor();//Create the operation you need to apply foreach (var wrapper in wrappers) { wrapper.Accept(visitor); } 

您所要做的就是为每个需要执行的操作创建一个新访问者。

这是输出的Demo

 Serializing Wrapper`1[System.Object] Serializing Wrapper`1[System.String] Serializing Wrapper`1[System.Int32] 

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

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