C #: tipi generici multipli in una lista

Questo probabilmente non è ansible, ma ho questa class:

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

C’è dell’altro, ma facciamo in modo che sia semplice. Il tipo generico (DataType) è limitato ai tipi di valore dall’istruzione where. Quello che voglio fare è avere un elenco di questi oggetti Metadata di tipi diversi (DataType). Ad esempio:

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

È ansible?

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

Seguendo la risposta di Leppie, perché non rendere MetaData un’interfaccia:

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

Ho anche usato una versione non generica, usando la new parola chiave:

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

L’implementazione dell’interfaccia esplicita viene utilizzata per consentire sia ai membri 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; } } 

Puoi ricavare un tipo di valore di targeting per versione:

 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) {} } 

Questo può essere esteso a qualsiasi tipo di vincoli generici.