处理不同表示的方法
本文关键字:方法 表示 处理 | 更新日期: 2023-09-27 18:03:01
我有一个基本的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是"格式化"的值。
所以我可能有来自同一设备的两个标签:
DataTag t1 = DataTag.Create<ushort,int>();
DataTag t2 = DataTag.Create<ushort[],float()>;
现在我有一个类,它应该包含一个通用标签列表
private IEnumerable<DataTag<?,?> _tags();
当然c#不会在同一个列表中接受不同类型的泛型,但这就是我想要实现的。对此有什么建议吗?
一种常见的方法是声明一个非泛型基类。当然,它不会为您提供对数据的强类型访问,但您可能会获得一个普通的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,并将值作为构造函数参数传入,使类型更接近不可变。(如果泛型类型参数中的任何一个本身是可变类型,则不会是"适当"不可变的,但总比没有好……)