有没有办法在switch语句中输入所有案例?

时间:2019-01-31 23:26:58

标签: c# .net

我正在使用switch语句,该语句根据情况设置对象的某些属性-引入了新要求,即添加了一条Case语句“ All”以本质上执行所有情况以应用所有字段-在特殊情况下。

我无法真正找到解决这个问题的好方法,每个case语句仅设置1-2个属性值,因此不值得将逻辑分为方法。但是,我也不想加载大量重复代码。

var person = new Person();
switch (PersonEnum)
{
    case PersonEnum.Name:
        person.Name = ...
        break;
    case PersonEnum.Age: 
       person.Age = ...
       break;
     case PersonEnum.All:
       person.Name = ...         
       person.Age = ...
       break;

上面的示例代码是我正在处理的事情的简化版本,但是这个想法仍然适用。

3 个答案:

答案 0 :(得分:6)

使用Flags枚举将更加实用。在这种情况下,您可以执行以下操作:

if (PersonEnum.HasFlag(PersonEnum.Name)) // Name is set. HasFlag is equivalent to (PersonEnum & PersonEnum.Name) != 0
{
    person.Name = ...
}

if (PersonEnum.HasFlag(PersonEnum.Age)) // Age is set
{
    person.Age = ...
}
...

在这种情况下,您甚至不需要检查PersonEnum.All

您的枚举应该是这样的:

[Flags]
enum PersonEnum 
{
  Name = 1,
  Age = 2,
  LastName = 4,
  ...
  NameAndAge = Name | Age,
  All = Name | Age | LastName ...
}

答案 1 :(得分:1)

您可以将其分成if语句,而不是将代码最小化

if (PersonEnum == PersonEnum.All || PersonEnum == PersonEnum.Name)
   person.Name = ...
if (PersonEnum == PersonEnum.All || PersonEnum == PersonEnum.Age)
   person.Age = ...

答案 2 :(得分:0)

实际上,有一种方法可以做到这一点,虽然不像Java支持的那样好,但是您可以使用goto来达到类似的效果,是的。 应该指出的是,尽管goto语句带有污名,也许这是可以的地方,最好是代码简短,简洁且易于阅读的地方。

但是对于这种特定情况,它可能不是最佳选择。这里最好的选择是factory pattern.

switch (personEnum)
{
  case PersonEnum.Name:
    person.Name = "";
    goto case PersonEnum.Age;
  case PersonEnum.Age:
    ...