我正在使用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;
上面的示例代码是我正在处理的事情的简化版本,但是这个想法仍然适用。
答案 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:
...