Provavelmente isso não é possível, mas eu tenho esta classe:
public class Metadata<DataType> where DataType : struct
{
private DataType mDataType;
}
Há mais do que isso, mas vamos simplificar. O tipo genérico (DataType) é limitado aos tipos de valor pela instrução where. O que eu quero fazer é ter uma lista desses objetos de metadados de tipos variados (DataType). Tal como:
List<Metadata> metadataObjects;
metadataObjects.Add(new Metadata<int>());
metadataObjects.Add(new Metadata<bool>());
metadataObjects.Add(new Metadata<double>());
Isso é possível?
List<object>
? Eles não param de boxe / desembalam, não eliminam a necessidade de transmissão e, finalmente, você está recebendo umMetadata
objeto que não diz nada sobre o realDataType
, eu estava procurando uma solução para resolver esses problemas. Se você declarar uma interface / classe, apenas para poder colocar o tipo genérico de implementação / derivado em uma lista genérica, quão diferente é isso do que usarList<object>
outro que não tenha uma camada sem sentido?List<Metadata<object>>
faz o truque.struct
restrição, ele não funciona aqui. VejaMetaData
tipos de referência em vez dos tipos de valor originais sem informações (tempo de compilação) sobre o tipo de valor subjacente de cada elemento, que é efetivamente "boxing".Respostas:
fonte
List<object>
? por favor, olhe meu comentário postado na pergunta do OP.Seguindo a resposta de leppie, por que não fazer
MetaData
uma interface:fonte
Também usei uma versão não genérica, usando a
new
palavra-chave:A implementação explícita da interface é usada para permitir os dois
Data
membros:Você pode derivar uma versão que segmenta tipos de valor:
Isso pode ser estendido a qualquer tipo de restrições genéricas.
fonte
DataType
eobject Data
ajudou muito)Deserialize<metadata.DataType>(metadata.Data);
. Ele diz que não é possível resolver os metadados do símbolo . Como recuperar o DataType para usá-lo para um método genérico?