Це, мабуть, неможливо, але у мене є такий клас:
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, Обидва обмежують лише типи посилань, будь-який вбудований тип значення та будь-яку структуру. Також, врешті-решт, у вас є список
—
Saeb Amini
MetaData
типів посилань замість вихідних типів значень, що не мають (час компіляції) інформації про тип базового значення кожного елемента, це ефективно "бокс".
List<object>
? Вони не зупинятимуть бокс / розблокування, не знімуть потреби в кастингу, і, зрештою, ви отримуєтеMetadata
об'єкт, який нічого не розповість про фактичнеDataType
, я шукав рішення для вирішення цих проблем. Якщо ви збираєтесь оголосити інтерфейс / клас, просто заради того, щоб мати змогу поставити реалізований / похідний загальний тип у загальний список, наскільки це відрізняється від використанняList<object>
іншого, ніж мати безглуздий шар?