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>()); 

这甚至有可能吗?

3 Solutions collect form web for “C# – 一个列表中的多个genericstypes”

 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的通用约束。

  • 调用静态generics方法
  • 如何确定列表是否在Java中sorting?
  • 我如何使用reflection来调用一个通用的方法?
  • 为什么C#构造函数不能推断types?
  • C#generics和types检查
  • Javagenerics:List,List <Object>,List <?>
  • Mockito:使用通用参数进行validation
  • StringDictionary vs Dictionary <string,string>
  • 与generics拳击和拆箱
  • Javagenerics的types参数中的问号是什么意思?
  • 在C#中将Int转换为通用枚举