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

  • 何时使用通用方法以及何时使用通配符?
  • genericstypes参数协方差和多个接口实现
  • List <List <int >>的组合
  • 两个C#扩展通用方法之间的模糊调用其中T:class和其他T:struct
  • 在C#generics中有没有合理的方法来“默认”types的参数?
  • generics使用语句:使用ISet <> = System.Collections.Generic.ISet <>
  • List <Void>的目的是什么?
  • 在asp.net mvc有可能使一个通用的控制器?
  • 有没有一个通用的Task.WaitAll?
  • 该types必须是引用types才能在通用types或方法中将其用作参数“T”
  • 无法为通用types的Java集合添加值