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

我正在使用一个 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;

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


冉冉说
浏览 142回答 3
3回答

12345678_0001

使用 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 ...}

慕哥9229398

您可以将其分成 if 语句,以稍微减少代码if (PersonEnum == PersonEnum.All || PersonEnum == PersonEnum.Name)   person.Name = ...if (PersonEnum == PersonEnum.All || PersonEnum == PersonEnum.Age)   person.Age = ...

拉风的咖菲猫

实际上有一种方法可以做到这一点,它不如Java支持的falls那么好,但是你可以实现类似的东西,是的,它就是这样。应该指出的是,尽管与goto语句相关的污名化,但也许这是一个可以接受的地方,最好是代码简短,简洁且易于阅读。goto但是,对于此特定方案,它可能不是最佳选择。这里更好的选择是工厂模式。switch (personEnum){  case PersonEnum.Name:    person.Name = "";    goto case PersonEnum.Age;  case PersonEnum.Age:    ...
打开App,查看更多内容
随时随地看视频慕课网APP