泛型的通用列表

Ste*_*ers 12 c# generics .net-3.5

我正在尝试将通用对象列表存储在通用列表中,但我很难声明它.我的对象看起来像:

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

    /*
    ...
    */
}
Run Code Online (Sandbox Code Playgroud)

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

{ Field<DateTime>, Field<int>, Field<double>, Field<DateTime> }
Run Code Online (Sandbox Code Playgroud)

那么我该怎么宣布呢?

List<Field<?>>
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 23

这种情况下,拥有包含非泛型位的抽象基类(或接口)可能会使您受益:

public abstract class Field
{
    public string Name { get; set; }
    public string Description { get; set; }
}

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

    /*
    ...
    */
}
Run Code Online (Sandbox Code Playgroud)

那你就可以了List<Field>.这表达了您对列表实际了解的所有信息.您不知道字段值的类型,因为它们可能因字段而异.


Guf*_*ffa 6

如果在编译时不知道泛型类型,则无法声明泛型类型列表.

你可以声明一个List<Field<int>>或一个List<Field<double>>,但没有其他常见的基本类型Field<int>Field<double>object.所以唯一List<T>可以容纳不同种类的领域的是List<object>.

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


Ant*_*ram 5

也许实现一个接口.

interface IField
{
}

class Field<T> : IField
{
}
Run Code Online (Sandbox Code Playgroud)

...

List<IField> fields = new List<IField>() { new Field<int>(), new Field<double>() };
Run Code Online (Sandbox Code Playgroud)