考虑以下代码:
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},
};
如何为委托字典模式设置默认值?
答案 0 :(得分:15)
要设置默认值,您只需将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>
答案 1 :(得分:3)
很抱歉,但您的解决方案对我来说很糟糕。您不需要任何额外的字典来使用枚举,您可以创建一个新方法并使用Enum.TryParse方法:
SmsStatusEnum GetStatus(int value)
{
SmsStatusEnum val;
if(Enum.TryParse<SmsStatusEnum>(value.ToString(), out val))
return val;
else
return SmsStatusEnum.Failed;
}
答案 2 :(得分:0)
我这样走:
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},
};