C#中列表儲存多種泛型類型
C#中的泛型類型為建立可操作各種資料類型的類別和方法提供了強大的機制。然而,當嘗試在一個清單中使用多個泛型類型時,通常會遇到一個常見問題。
考慮以下範例:
<code class="language-csharp">public class Metadata<DataType> where DataType : struct { private DataType mDataType; } List<Metadata<DataType>> metadataObjects; //错误: DataType 未定义 metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
這裡的目標是建立一個包含不同資料類型的Metadata物件的清單。但是,Metadata<DataType>
類別上的where
約束將泛型類型DataType
限制為值類型。這意味著metadataObjects
清單中的每個項目都必須是相同的泛型類型,因此無法新增不同類型的物件。
為了克服這個限制,一個方法是為Metadata
引入一個抽象基類,如下所示:
<code class="language-csharp">public abstract class Metadata { } // 继承抽象 Metadata 类 public class Metadata<DataType> : Metadata where DataType : struct { private DataType mDataType; }</code>
透過建立一個抽象基底類別Metadata
,泛型類別Metadata<DataType>
現在可以擴充此基底類別。這允許我們擁有一個Metadata
物件的列表,其中每個項目可以是不同的泛型類型。
修改後的程式碼如下圖所示:
<code class="language-csharp">List<Metadata> metadataObjects = new List<Metadata>(); metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
現在,metadataObjects
列表可以保存不同值類型的對象,有效地實現了在一個列表中擁有多個泛型類型的目標。 要注意的是,在存取mDataType
屬性時需要進行型別轉換,因為Metadata
基類並不知道具體的DataType
。
以上是如何在 C# 中的單一清單中儲存多個泛型類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!