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?
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?List<Metadata<object>>
Hace el truco.struct
restricción, no funciona aquí. VerMetaData
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".Respuestas:
fuente
List<object>
? mira mi comentario publicado bajo la pregunta de OP.Siguiendo la respuesta de leppie, ¿por qué no hacer
MetaData
una interfaz?fuente
También he usado una versión no genérica, usando la
new
palabra clave:La implementación explícita de la interfaz se utiliza para permitir que ambos
Data
miembros:Podría derivar una versión orientada a los tipos de valor:
Esto puede extenderse a cualquier tipo de restricciones genéricas.
fuente
DataType
yobject Data
ayudó mucho)Deserialize<metadata.DataType>(metadata.Data);
. Me dice que no puedo resolver los metadatos de los símbolos . ¿Cómo recuperar el DataType para usarlo para un método genérico?