C# – 一个列表中的多个genericstypes

这可能是不可能的,但我有这个类:

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

还有更多,但让我们保持简单。 genericstypes(DataType)被where语句限制为值types。 我想要做的是具有不同types(DataType)的这些元数据对象的列表。 如:

 List<Metadata> metadataObjects; metadataObjects.Add(new Metadata<int>()); metadataObjects.Add(new Metadata<bool>()); metadataObjects.Add(new Metadata<double>()); 

这甚至有可能吗?

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

按照leppie的回答,为什么不让MetaData成为一个界面:

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

我也使用了一个非通用版本,使用new关键字:

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

显式接口实现用于允许两个Data成员:

 public class Metadata<TData> : IMetadata<TData> { 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; } } 

您可以派生一个版本定位值types:

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

这可以扩展到任何types的通用约束。