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