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?
A classe base abstrata e a interface fornecem um grau de controle, restringindo o tipo de elementos que podem ser adicionados à lista. Também não consigo ver como o boxe entra nisso.
—
0b101010
Obviamente, se você estiver usando o .NET v4.0 ou superior, a covariância é a solução.
—
0101010
List<Metadata<object>>
faz o truque.
@ 0b101010, Ambos apenas restringem tipos de referência, qualquer tipo de valor interno e qualquer estrutura ainda podem ser adicionados. Além disso, no final, você tem uma lista de
—
Saeb Amini 29/09
MetaData
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".
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?