Это, вероятно, не возможно, но у меня есть этот класс:
public class Metadata<DataType> where DataType : struct
{
private DataType mDataType;
}
Это еще не все, но давайте будем простыми. Универсальный тип (DataType) ограничен типами значений оператором where. То, что я хочу сделать, это иметь список этих объектов метаданных различных типов (DataType). Такие как:
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<int>());
metadataObjects.Add(new Metadata<bool>());
metadataObjects.Add(new Metadata<double>());
Это вообще возможно?
Как абстрактный базовый класс, так и интерфейс обеспечивают степень контроля, ограничивая тип элементов, которые могут быть добавлены в список. Я также не могу понять, как бокс вступает в это.
—
0b101010
Конечно, если вы используете .NET v4.0 или выше, то ковариация является решением.
—
0b101010
List<Metadata<object>>
делает трюк.
@ 0b101010, оба могут ограничивать только ссылочные типы, любой встроенный тип значения и любая структура все еще могут быть добавлены. Кроме того, в конце у вас есть список
—
Саиб Амини,
MetaData
ссылочных типов вместо ваших исходных типов значений без информации о времени компиляции (времени компиляции), что фактически является «упаковкой».
List<object>
? Они не прекратят боксировать / распаковывать, не убирают необходимость в кастинге, и, в конечном счете, вы получаетеMetadata
объект, который ничего не говорит вам о реальномDataType
, я искал решение для решения этих проблем. Если вы собираетесь объявить интерфейс / класс, просто для того, чтобы иметь возможность поместить реализующий / производный универсальный тип в универсальный список, насколько он отличается от использованияList<object>
другого, отличного от бессмысленного слоя?