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中文网其他相关文章!