Универсальный список дженериков

Я пытаюсь сохранить список родовых объектов в универсальном списке, но я испытываю затруднения при объявлении этого. Мой объект похож:

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).

12
задан Steven Evers 23 April 2010 в 20:36
поделиться

3 ответа

Это ситуация, когда может принести вам пользу, имея абстрактный базовый класс (или interface), содержащий неуниверсальные биты:

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 . Это выражает всю информацию, которую вы действительно знаете о списке. Вы не знаете типы значений полей, поскольку они могут варьироваться от одного поля к другому.

23
ответ дан 2 December 2019 в 04:25
поделиться

Вы не можете объявить список универсальных типов, не зная универсального типа во время компиляции.

Вы можете объявить List > или List > , но нет другого общего базового типа для Field < int> и Поле , чем объект . Таким образом, единственный List , который может содержать различные типы полей, будет List .

Если вам нужен более конкретный тип для списка, вам нужно сделать так, чтобы класс Field унаследовал класс или реализовал интерфейс. Затем вы можете использовать это для универсального типа в списке.

6
ответ дан 2 December 2019 в 04:25
поделиться

Возможно, реализовать интерфейс.

interface IField
{
}

class Field<T> : IField
{
}

...

List<IField> fields = new List<IField>() { new Field<int>(), new Field<double>() };
5
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: