Probablemente esto no sea posible, pero tengo esta clase:
public class Metadata<DataType> where DataType : struct
{
private DataType mDataType;
}
Hay más, pero seamos simples. El tipo genérico (DataType) está limitado a los tipos de valor mediante la instrucción where. Lo que quiero hacer es tener una lista de estos objetos de metadatos de diferentes tipos (DataType). Como:
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<int>());
metadataObjects.Add(new Metadata<bool>());
metadataObjects.Add(new Metadata<double>());
¿Es esto posible?
Tanto la clase base abstracta como la interfaz proporcionan un grado de control al restringir el tipo de elementos que se pueden agregar a la lista. Tampoco puedo ver cómo el boxeo entra en esto.
—
0b101010
Por supuesto, si está utilizando .NET v4.0 o superior, entonces la covarianza es la solución.
—
0b101010
List<Metadata<object>>
Hace el truco.
@ 0b101010, Ambos solo restringen los tipos de referencia, cualquier tipo de valor incorporado y cualquier estructura aún se pueden agregar. Además, al final, tiene una lista de
—
Saeb Amini
MetaData
tipos de referencia en lugar de sus tipos de valores originales sin información (tiempo de compilación) sobre el tipo de valor subyacente de cada elemento, eso es efectivamente "boxing".
List<object>
? No detendrán el boxeo / desempaquetado, no eliminarán la necesidad de lanzar y, en última instancia, está obteniendo unMetadata
objeto que no le dice nada sobre lo realDataType
, estaba buscando una solución para abordar esos problemas. Si va a declarar una interfaz / clase, solo por el hecho de poder poner el tipo genérico implementado / derivado en una lista genérica, ¿qué tan diferente es eso de usarList<object>
otro que no sea una capa sin sentido?