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

  • 本文关键字:返回值 配置 c# .net-4.5
  • 更新时间 :
  • 英文 :


i获得了一个电子表格,其中可能是返回代码及其在第三方Web服务中的描述。他们看起来像这样(简化(:

 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代码为 no Match

在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表中保存所有可能的代码和描述是实现此目的的最佳方法吗?谢谢。

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

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

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

伪代码看起来像

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); 

我会很想转换为枚举。

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;
}

相关内容

  • 没有找到相关文章

最新更新