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

时间:2008-12-09 15:29:58

标签: c# generics

这可能不可能,但我有这个课程:

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

这甚至可能吗?

3 个答案:

答案 0 :(得分:160)

public abstract class Metadata
{
}

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

答案 1 :(得分:79)

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

public interface IMetaData { }

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

答案 2 :(得分:28)

我还使用了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)
    {}
}

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