首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型的泛型列表

泛型的泛型列表
EN

Stack Overflow用户
提问于 2010-04-24 04:36:19
回答 3查看 10.3K关注 0票数 13

我试图将泛型对象的列表存储在泛型列表中,但在声明它时遇到了困难。我的对象看起来像:

代码语言:javascript
复制
public class Field<T>
{
    public string Name { get; set; }
    public string Description { get; set; }
    public T Value { get; set; }

    /*
    ...
    */
}

我想创建一个这样的列表。我的问题是,列表中的每个对象都可以有一个单独的类型,因此填充的列表可以包含以下内容:

代码语言:javascript
复制
{ Field<DateTime>, Field<int>, Field<double>, Field<DateTime> }

那么我该如何声明呢?

代码语言:javascript
复制
List<Field<?>>

(我希望尽可能保持类型安全,所以我不想使用ArrayList)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-24 04:38:11

在这种情况下,拥有一个包含非泛型位的抽象基类(或接口)可能会对您有所帮助:

代码语言:javascript
复制
public abstract class Field
{
    public string Name { get; set; }
    public string Description { get; set; }
}

public class Field<T> : Field
{    
    public T Value { get; set; }

    /*
    ...
    */
}

然后你就可以拥有一个List<Field>了。它表达了你实际知道的关于列表的所有信息。您不知道字段值的类型,因为不同字段的值可能会有所不同。

票数 24
EN

Stack Overflow用户

发布于 2010-04-24 04:47:11

在编译时不知道泛型类型的情况下,不能声明泛型类型列表。

您可以声明List<Field<int>>List<Field<double>>,但是除了object之外,对于Field<int>Field<double>,没有其他通用的基类型。因此,唯一可以容纳不同类型字段的List<T>将是List<object>

如果希望列表具有更具体的类型,则必须使Field<T>类继承一个类或实现一个接口。然后,您可以将其用于列表中的泛型类型。

票数 6
EN

Stack Overflow用户

发布于 2010-04-24 04:40:22

也许实现一个接口。

代码语言:javascript
复制
interface IField
{
}

class Field<T> : IField
{
}

..。

代码语言:javascript
复制
List<IField> fields = new List<IField>() { new Field<int>(), new Field<double>() };
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2701830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档