请考虑以下代码:
switch (number)
{
case 1:
Number = (int)SmsStatusEnum.Sent;
break;
case 2:
Number = (int)SmsStatusEnum.Delivered;
break;
case 3:
Number = (int)SmsStatusEnum.Failed;
break;
default:
Number = (int)SmsStatusEnum.Failed;
break;
}
return Number;
我有一个默认的switch case
。因此,如果number
不是 1,2 或 3 结果Failed
.所以我将代码转换为委托字典:
var statuses = new Dictionary<int, Func<SmsStatusEnum>>
{
{1,()=> SmsStatusEnum.Sent},
{2,()=> SmsStatusEnum.Delivered},
{3,()=> SmsStatusEnum.Failed},
};
如何设置委托字典模式的默认值?
要设置默认值,您只需将Dictionary
包装在函数中
SmsStatusEnum GetStatus(int value) {
Func<SmsStatusEnum> func;
if (!statuses.TryGetValue(value, out func)) {
// Default value
return SmsStatusEnum.Failed;
}
return func();
}
在这种情况下,虽然我不太明白你为什么要在这里存储Func<SmsStatusEnum>
。 实际代码是否涉及Func<SmsStatusEnum>
实现中的计算? 如果是这样,那么这确实是一个很好的模式。 如果没有,那么您可能需要考虑直接存储Dictionary<int, SmsStatusEnum>
抱歉,您的解决方案对我来说看起来很糟糕。你不需要任何额外的字典来处理枚举,你可以创建一个新方法并使用Enum.TryParse方法:
SmsStatusEnum GetStatus(int value)
{
SmsStatusEnum val;
if(Enum.TryParse<SmsStatusEnum>(value.ToString(), out val))
return val;
else
return SmsStatusEnum.Failed;
}
我采用这种方式:
var validStatues = new int[] {1, 3, 2};
if (!validStatues.Any(x=>x == statusId))
{
statusId = 0;
}
var statuses = new Dictionary<int, Func<SmsStatusEnum>>
{
{1,()=> SmsStatusEnum.Sent},
{2,()=> SmsStatusEnum.Delivered},
{3,()=> SmsStatusEnum.Failed},
{0,()=> SmsStatusEnum.Failed},
};