C# 处理不同的表示方法

C# 处理不同的表示方法,c#,generics,C#,Generics,我有一个基本的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; } } 公共抽象类

我有一个基本的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; }
}
公共抽象类DataTag
{
公共抽象TVal值{get;}
public TRaw RawValue{get;set;}
公共字符串名称{get;private set;}
公共字符串Desc{get;private set;}
}
其中,TRaw是从设备获取的原始数据,而TVal是“格式化”值

因此,我可能有来自同一设备的2个标签:

DataTag t1 = DataTag.Create<ushort,int>();
DataTag t2 = DataTag.Create<ushort[],float()>;
DataTag t1=DataTag.Create();
datatagt2=DataTag.Create;
现在我有了一个类,它应该包含一个泛型标记列表

private IEnumerable<DataTag<?,?> _tags();

private IEnumerable一种常见的方法是声明非泛型基类。当然,它不会为您提供对数据的强类型访问,但您可能会获得一个普通的
对象
版本以及名称/描述

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; } }
}
公共抽象类DataTag
{
公共字符串名称{get;private set;}
公共字符串说明{get;private set;}
公共抽象对象弱值{get;}
公共抽象对象WeakRawValue{get;}
}
公共抽象类DataTag:DataTag
{
公共抽象TVal值{get;}
public TRaw RawValue{get;set;}
公共重写对象弱值{get{return Value;}}
公共重写对象WeakRawValue{get{return RawValue;}}
}
那么您的列表就是一个
IEnumerable

注:

  • 我为“弱类型”属性指定了不同的名称。您可以使用
    Value
    RawValue
    ,然后在泛型类型中重新声明它们(使用
    new
    ),但在其他方面这是一个棘手的问题。如果可以,请避免命名冲突
  • 我只为
    WeakRawValue
    提供了一个getter——您也可以提供一个setter,并在泛型类型中强制转换,但这让我觉得很难看。见鬼,我个人会尝试完全摆脱setter,并将值作为构造函数参数传入,使类型更接近不可变。(如果任何一个泛型类型参数本身都是可变类型,那么它将不会“正确地”不可变,但总比没有好…)

这与这个问题类似。这里有一个代码示例:这是我想到的第一个解决方案。然而,我在寻找一些不同的东西。@Vincenzo:如果你已经想出了一个解决方案,并且放弃了它——可能是出于某种原因——那么在你写问题时这样说是很有帮助的。不过,我不知道还有什么更好的办法。为什么您不喜欢这种方法?我正在寻找一种新的解决方案(如果有的话),以更好地处理这个问题。但是,您的答案和建议的解决方案非常专业,而且比我的解决方案更好。谢谢。@JonSkeet因为我不知道您是否可以阅读我在删除的答案中对您的评论的回答,谢谢您指出我的错误。@JonSkeet我很好奇您为什么不喜欢命名冲突?我个人认为这更清楚,因为当您访问它时,属性名称(例如,
)总是相同的,只是它是“适当键入”的,用于您可以访问的内容。否则,当您通过类型化实例(
DataTag
)使用该属性时,您将同时看到
Value
WeakValue
,并且
WeakValue
在这种情况下绝对不提供任何值,只会使IntelliSense变得混乱。