C #-一个列表中的多个泛型类型

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

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

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

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

这有可能吗?

118677 次浏览
public abstract class Metadata
{
}


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

根据莱皮的回答,为什么不让 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; }
}

您可以派生一个针对值类型的版本:

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

这可以扩展到任何类型的泛型约束。