Vários tipos genéricos em uma lista

Isso provavelmente não é possível, mas eu tenho essa class:

public class Metadata where DataType : struct { private DataType mDataType; } 

Há mais, mas vamos simplificar. O tipo genérico (DataType) é limitado a tipos de valor pela instrução where. O que eu quero fazer é ter uma lista desses objects de metadados de tipos variados (DataType). Tal como:

 List metadataObjects; metadataObjects.Add(new Metadata()); metadataObjects.Add(new Metadata()); metadataObjects.Add(new Metadata()); 

Isso é possível?

 public abstract class Metadata { } // extend abstract Metadata class public class Metadata : Metadata where DataType : struct { private DataType mDataType; } 

Seguindo a resposta de leppie, por que não transformar o MetaData uma interface:

 public interface IMetaData { } public class Metadata : IMetaData where DataType : struct { private DataType mDataType; } 

Eu também usei uma versão não genérica, usando a new palavra-chave:

 public interface IMetadata { Type DataType { get; } object Data { get; } } public interface IMetadata : IMetadata { new TData Data { get; } } 

Implementação de interface explícita é usada para permitir que os membros de Data :

 public class Metadata : IMetadata { public Metadata(TData data) { Data = data; } public Type DataType { get { return typeof(TData); } } object IMetadata.Data { get { return Data; } } public TData Data { get; private set; } } 

Você pode derivar um tipo de valor de segmentação por versão:

 public interface IValueTypeMetadata : IMetadata { } public interface IValueTypeMetadata : IMetadata, IValueTypeMetadata where TData : struct { } public class ValueTypeMetadata : Metadata, IValueTypeMetadata where TData : struct { public ValueTypeMetadata(TData data) : base(data) {} } 

Isso pode ser estendido para qualquer tipo de restrição genérica.