存储派生对象的通用类列表

时间:2015-10-16 23:34:31

标签: c# generics inheritance polymorphism

例如,如何存储所有使用从同一基类派生的类型的DataContainer列表。

public class Animal {}
public class Cat : Animal {}
public class Dog : Animal {}
public class DataContainer <TData> where TData : Animal {
    TData innerObject = new TData ();
    public TData GetData () {
        return innerObject;
    }
}

public class DataManager {
    static void Main () {
        DataContainer<Cat> CatData = new DataContainer<Cat> ();
        DataContainer<Dog> DogData = new DataContainer<Dog> ();
        var AnimalData = new List<DataContainer<Animal>> ();
        AnimalData.Add (CatData);
        AnimalData.Add (DogData);
        for (int i = 0; i < AnimalData.Count; i++) {
            Animal animal = AnimalData[i].GetData ();
        }
    }
}

如果使用泛型类是不可能的,那么可以使用Arrays吗?

编辑:出现此错误:ArrayTypeMismatchException: Source array type cannot be assigned to destination array type.这会导致ArrayTypeMismatchException:

public interface IDataContainer <out TData> where TData : Animal {

}
public class DataContainer <TData> : IDataContainer<TData> where TData : Animal {

}

public class Tester () {
    static void Main () {
        var AnimalData = new List<DataContainer<Animal>> ();
        var CatData = new DataContainer<Cat> ();
        AnimalData.Add (CatData as IDataContainer<Animal>); //Error
    }
}

在Unity 5.2中运行

1 个答案:

答案 0 :(得分:2)

问题是您需要通用类具有covariant类型参数。

您只能在界面上执行此操作,因此请创建一个:

public interface IDataContainer <out TData> where TData : Animal 
{
    TData GetData ();
}

请注意使用outTData标记为协变。现在让您的DataContainer类实现接口,当您在客户端代码中保留引用时,请确保它为IDataContainer。现在它应该让你按照预期存储它。

请注意,协变接口有特殊要求,即泛型类型参数不能用作任何方法的参数类型(有关更多信息,请参阅MSDN链接)。