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