在C#中设计可配置的返回值

时间:2017-04-28 18:36:35

标签: c# .net-4.5

我收到了一份电子表格,其中包含可能的返回代码及其来自第三方网络服务的说明。它们看起来像这样(简化):

 Code       Description
 M1         Some description of M1
 M2         Some description of M2
 M3         Some description of M3
 M4         Some description of M4
 P1         Some description of P1
 P2         Some description of P2
 N1         Some description of N1
 N2         Some description of N2

在上面的列表中,M代码分类为匹配,P代码部分匹配,I代码不匹配

在C#函数中,这些返回值由switch case处理,如下所示:

...
switch(returncode)
{
case "M1":
case "M2":
case "M3":
case "M4":
     DoSomethingForMatch(ReturnCodeDescription); 
     break;
case "P1":
case "P2":
case "P3":
case "P4": 
     DoSomethingForPartialMatch(ReturnCodeDescription);
     break;
case "N1":
case "N2": 
default:
     DoSomethingForNoMatch(ReturnCodeDescription); 
     break;
}

虽然返回代码看起来很相似,但没有命名约定。将来可能有其他返回代码可能有不同的格式。但它们仍然属于以下三种类别中的一种:匹配,部分匹配和不匹配。

如果将来有新的返回代码,使用此设计,我必须更新代码并重建,重新部署等。

这样做是一种更好的方法,而不是像这样对代码中的返回值进行硬编码。我想以可配置,可扩展的方式询问您如何执行此操作的建议。是否在DB表中保存所有可能的代码和描述是实现此目的的最佳方法? 谢谢。

3 个答案:

答案 0 :(得分:4)

为什么不检查第一个字符?

switch(returncode[0])
{
    case 'M':
         DoSomethingForMatch(ReturnCodeDescription); 
         break;
    case 'P':
         DoSomethingForPartialMatch(ReturnCodeDescription);
         break;
    case 'N': 
    default:
         DoSomethingForNoMatch(ReturnCodeDescription); 
         break;
}

答案 1 :(得分:2)

如果返回代码在某种程度上可以预测以备将来使用,则可以使用正则表达式。

伪代码看起来像

RegEx fullMatch = new RegEx("some_reg_ex_here");
RegEx partialMatch = new RegEx("some_reg_ex_here");

if (fullMatch.IsMatch(returnCode)
  DoSomethingForMatch(ReturnCodeDescription); 
else if (partialMatch.IsMatch(returnCode)
  DoSomethingForPartialMatch(ReturnCodeDescription);
else
  DoSomethingForNoMatch(ReturnCodeDescription); 

答案 2 :(得分:0)

我很想转换成枚举。

<强> Code.cs

enum Code
{
    Unknown = 0,
    Match = 'M',
    PartialMatch = 'P',
    NoMatch = 'N'
}

static class CodeExtensions
{
    public static Code ToCode(this string value)
    {
        value = value.Trim();

        if (String.IsNullOrEmpty(value))
            return Code.Unknown;

        if (value.Length != 2)
            return Code.Unknown;

        return value[0].ToCode();
    }

    public static Code ToCode(this char value)
    {
        int numericValue = value;
        if (!Enum.IsDefined(typeof(Code), numericValue))
            return Code.Unknown;

        return (Code)numericValue;
    }
}

<强>用法

var code = returnCode.ToCode();
switch (code)
{
    case Code.Match:
        DoSomethingForMatch(ReturnCodeDescription); 
        break;
    case Code.PartialMatch:
        DoSomethingForPartialMatch(ReturnCodeDescription);
        break;
    default:
        DoSomethingForNoMatch(ReturnCodeDescription); 
        break;
}