代码之家  ›  专栏  ›  技术社区  ›  Steven Evers

泛型列表

  •  10
  • Steven Evers  · 技术社区  · 14 年前

    我试图将泛型对象的列表存储在泛型列表中,但是我很难声明它。我的物品看起来像:

    public class Field<T>
    {
        public string Name { get; set; }
        public string Description { get; set; }
        public T Value { get; set; }
    
        /*
        ...
        */
    }
    

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

    { Field<DateTime>, Field<int>, Field<double>, Field<DateTime> }
    

    那我该怎么申报呢?

    List<Field<?>>
    

    (我想保持尽可能的打字安全,所以我不想使用arraylist)。

    3 回复  |  直到 14 年前
        1
  •  22
  •   Anthony Pegram    14 年前

    在这种情况下 可以 有一个包含非泛型位的抽象基类(或接口)对您有好处:

    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> . 它表达了你所知道的关于列表的所有信息。您不知道字段值的类型,因为它们可能因字段而异。

        2
  •  5
  •   Anthony Pegram    14 年前

    也许实现一个接口。

    interface IField
    {
    }
    
    class Field<T> : IField
    {
    }
    

    List<IField> fields = new List<IField>() { new Field<int>(), new Field<double>() };
    
        3
  •  5
  •   Guffa    14 年前

    在编译时,如果不知道泛型类型,就不能声明泛型类型列表。

    你可以申报 List<Field<int>> 或A List<Field<double>> ,但没有其他公共基类型 Field<int> Field<double> object . 所以唯一 List<T> 可以容纳不同种类的能量场 List<object> .

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