2015-10-16 77 views
1

例如,如何存储所有使用派生自相同基类的类型的DataContainers的列表。存储派生对象的泛型类的列表

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(); 
     } 
    } 
} 

如果对于一个泛型类来说是不可能的,那么数组是否可能呢?

编辑:收到此错误:ArrayTypeMismatchException: Source array type cannot be assigned to destination array type.这导致ArrayTypeMismatchException:在Unity 5.2

回答

2

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 
    } 
} 

运行问题是,你需要你的泛型类有covariant类型参数。

你只能做到这一点的接口,因此创建一个:

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

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

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

+0

完美的作品!谢谢! – user196399

+0

该铸造工程,但有什么办法可以添加covariant对象到集合? – user196399

+0

@ user196399不确定你的意思(在我的例子中没有强制转换)也许提供一个代码示例,或者提出一个新问题并给我一个链接? – BradleyDotNET