如何在 csharp 中使用泛型类型继承

本文关键字:泛型类型 继承 csharp | 更新日期: 2023-09-27 18:31:01

我有这个示例总结通用代码:

public class Box<E> where E : BoxProperties{
}
public class BoxProperties{
}
public class BlueBox : Box<BlueBox.BlueProperties >{
    public class BlueProperties : Properties{
    }
}
public class RedBox : Box<RedBox.RedProperties >{
    public class RedProperties : Properties{
    }
}

我需要创建一个可以将RedBox和BlueBox存储为值的字典。请帮忙吗?

如何在 csharp 中使用泛型类型继承

对于您所描述的类型,BlueBoxRedBox 之间最接近的共同祖先类型是 System.Object 。 你将不得不使用Dictionary<TKey, object>,或引入一些其他共同的祖先类型。

你可以

做这样的事情——

public class BoxProperties
{
}
interface IBox
{
}
public class Box<E> : IBox where E : BoxProperties
{
}
public class BlueBox : Box<BlueBox.BlueProperties>
{
    public class BlueProperties : BoxProperties
    {
    }
}
public class Properties
{
}
public class RedBox : Box<RedBox.RedProperties>
{
    public class RedProperties : BoxProperties
    {
    }
}

有了这个,您将能够做到 -

        var dictionary = new Dictionary<string, IBox>();
        dictionary.Add("a", new BlueBox());
        dictionary.Add("b", new RedBox());

我认为这取决于什么是类Box<E>

interface IBox<out E> where E : BoxProperties
{
}
public class Box<E> : IBox<E> where E : BoxProperties
{
}
public class BoxProperties
{
}
public class BlueBox : Box<BlueBox.BlueProperties>
{
    public class BlueProperties : BoxProperties
    {
    }
}
public class RedBox : Box<RedBox.RedProperties>
{
    public class RedProperties : BoxProperties
    {
    }
}

有了这个,你可以声明一个字典,比如:

var dic = new Dictionary<string, IBox<BoxProperties>>();
dic.Add("red", new RedBox());
dic.Add("blue", new BlueBox());

但是out不可能最适合你,看看这个