2015-10-16 61 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