委托字典模式的默认值



请考虑以下代码:

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

最新更新