Я пытаюсь сохранить список родовых объектов в универсальном списке, но я испытываю затруднения при объявлении этого. Мой объект похож:
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).
Это ситуация, когда может принести вам пользу, имея абстрактный базовый класс (или 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
. Это выражает всю информацию, которую вы действительно знаете о списке. Вы не знаете типы значений полей, поскольку они могут варьироваться от одного поля к другому.
Вы не можете объявить список универсальных типов, не зная универсального типа во время компиляции.
Вы можете объявить List
или List
, но нет другого общего базового типа для Field < int>
и Поле
, чем объект
. Таким образом, единственный List
, который может содержать различные типы полей, будет List
.
Если вам нужен более конкретный тип для списка, вам нужно сделать так, чтобы класс Field
унаследовал класс или реализовал интерфейс. Затем вы можете использовать это для универсального типа в списке.
Возможно, реализовать интерфейс.
interface IField
{
}
class Field<T> : IField
{
}
...
List<IField> fields = new List<IField>() { new Field<int>(), new Field<double>() };