3

我有一个以这种方式定义的基本 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# 不会在同一个列表中接受不同类型的泛型,但这是我想要实现的。有什么建议吗?

4

1 回答 1

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>.

笔记:

  • 我为“弱类型”属性赋予了不同的名称。您可以使用Valueand RawValue,然后在泛型类型中重新声明它们(with new),但这在其他方面会让人头疼。如果可以,请避免命名冲突。
  • 我只提供了一个getter——WeakRawValue也可以提供一个setter,并在泛型类型中进行强制转换,但这对我来说很难看。哎呀,我个人会尝试完全摆脱 setter,并将值作为构造函数参数传递,使类型更接近不可变。(如果任何一个泛型类型参数本身是可变类型,它就不会是“正确”不可变的,但总比没有好......)
于 2013-03-09T11:57:05.920 回答