C#:根据值切换返回值类型

时间:2017-05-18 13:33:07

标签: c# generics

我需要一个建议。情况如下:

我有一个用于操作某些硬件的库。该机器的一个参数是Quant(一个包装中应该有多少产品)。它可以有三种类型:

*quant type | value type*
 Weight     | double
 Pieces     | Integer
 Without    | null

我可以创建一个用于存储Quant值的结构,例如:

public struct Quant
{
    public QuantTypes QuantType { get; set; }
    public double QuantWeightValue { get; set; }
    public int QuantPieceValue { get; set; }
    ...
}

但在工作过程中,我需要多次检查quant的状态和值。而且变得困难,因为我需要根据quantType获得价值

if(QuantType == QuantTypes.Piece)
{
     if(QuantWeightValue > 5)
          QuantWeightValue += 2.5;
}
else
{     
     if(QuantPieceValue > 5)
          QuantPieceValue  += 2;
}
SetNewQuantToMachine();

我不喜欢它。我只能为double类型的量值制作一个字段。但是这种方式可以设置具有非整数值的片段类型的定量。在这种情况下,我看到两个解决方案:

  1. 在设置期间手动舍入值;

  2. 如果有人试图设置非整数片段量数,则抛出异常;

  3. 也许有人会给我一个建议,编写这样的代码是最佳做法。也许GenericTypes适合这种情况?

2 个答案:

答案 0 :(得分:3)

为Quant的每个子类型创建单独的类。提供一个方法,该方法使用IQuant接口,并使用dynamic调度到特定于类型的覆盖:

interface IQuant {
    QuantTypes QuantType { get; }
}
class QuantWeight {
    public QuantTypes QuantType {
        get { return QuantTypes.Weight; }
    }
    public double QuantWeightValue { get; }
}
class QuantCount {
    public QuantTypes QuantType {
        get { return QuantTypes.Pieces; }
    }
    public int PiecesValue { get; }
}

您的公开方法如下所示:

public void ProcessQuant(IQuant quant) {
    ProcessQuantImpl((dynamic)quant);
}
private void ProcessQuantImpl(QuantWeight weight) {
    ... // Do the real work here
}
private void ProcessQuantImpl(QuantCount pieces) {
    ... // Do the real work here
}

答案 1 :(得分:0)

抱歉,如果我弄错了。但我可以建议改变" Quant"使用所有计算来设置基本版本,然后创建具有不同变量的继承类的数量,然后使用类似" quant.GetValue()"的内容。它有意义吗?