我有一个以这种方式定义的基本DataTag类:
public abstract class DataTag<TRaw, TVal>
{
public abstract TVal Value { get; }
public TRaw RawValue { get; set; }
public string Name { get; private set; }
public string Desc { get; private set; }
}
其中TRaw是从设备获取的原始数据,而TVal是“格式化”值。
所以我可能有来自同一设备的2个标签:
DataTag t1 = DataTag.Create<ushort,int>();
DataTag t2 = DataTag.Create<ushort[],float()>;
现在我有一个应该包含通用标签列表的类
private IEnumerable<DataTag<?,?> _tags();
当然C#不会在同一个列表中接受不同类型的泛型,但这是我想要实现的。有什么提示吗?
答案 0 :(得分:4)
一种常见的方法是声明非泛型基类。当然,它不会为您提供强类型的数据访问权限,但您可以获得简单的object
版本以及名称/说明。
public abstract class DataTag
{
public string Name { get; private set; }
public string Description { get; private set; }
public abstract object WeakValue { get; }
public abstract object WeakRawValue { get; }
}
public abstract class DataTag<TRaw, TVal> : DataTag
{
public abstract TVal Value { get; }
public TRaw RawValue { get; set; }
public override object WeakValue { get { return Value; } }
public override object WeakRawValue { get { return RawValue; } }
}
然后您的列表只是IEnumerable<DataTag>
。
注意:
Value
和RawValue
,然后在通用类型中重新声明它们(使用new
),但这在其他方面是痛苦的。如果可以,请避免命名冲突。WeakRawValue
提供了一个getter - 你也可以提供一个setter,并在泛型类型中进行转换,但这对我来说感觉很难看。哎呀,我个人试图完全摆脱setter,并将值作为构造函数参数传递,使类型更接近于不可变。 (如果任何一个泛型类型参数本身都是一个可变类型,它就不会是“正确”不可变的,但它总比没有好......)