首页 >后端开发 >C++ >如何在 C# 中的单个列表中存储多个泛型类型?

如何在 C# 中的单个列表中存储多个泛型类型?

Barbara Streisand
Barbara Streisand原创
2025-01-18 16:41:09943浏览

How Can I Store Multiple Generic Types in a Single List in C#?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn