在C#中,可以建立一個有泛型型別參數的類別。但是,能否建立一個列表,其中包含多個具有不同類型參數的此泛型類別的不同實例?
讓我們考慮以下範例:
<code class="language-csharp">public class Metadata<DataType> where DataType : struct { private DataType mDataType; }</code>
這裡,我們有一個泛型類別Metadata
,可用於不同的值型別。現在,假設我們想要建立一個這些Metadata
物件的列表,這些物件具有不同的類型。我們能做到嗎?
<code class="language-csharp">List<Metadata<DataType>> metadataObjects; // 错误:DataType 未定义 metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
不幸的是,這在C#中是不可能的,因為列表的泛型類型參數對於所有元素都必須相同。要克服此限制,可以使用繼承和抽象類別。
<code class="language-csharp">public abstract class MetadataBase { } // 继承抽象 MetadataBase 类 public class Metadata<DataType> : MetadataBase where DataType : struct { private DataType mDataType; }</code>
現在,您可以建立一個抽象基底類別MetadataBase
的清單。這允許您將不同類型的Metadata
物件新增至清單:
<code class="language-csharp">List<MetadataBase> metadataObjects = new List<MetadataBase>(); metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>());</code>
透過使用抽象基類,我們成功地建立了一個可以容納不同類型Metadata
實例的清單。 需要注意的是,存取清單中元素的mDataType
屬性時需要進行類型轉換,因為MetadataBase
不包含該屬性。 這需要根據具體情況進行處理,例如使用dynamic
類型或is
運算符進行類型檢查和轉換。
以上是C# 清單可以保存具有不同類型參數的多個泛型類別實例嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!