gia*_*min 7 c# enums enum-flags
我需要将具有3个bool属性的遗留类转换为标记枚举.
我知道至少有一个属性是真的.
[Flags]
public enum FlagEnum
{
EnumValue1 = 1,
EnumValue2 = 2,
EnumValue3 = 4
}
public class LegacyClass
{
public bool PropA { get; set; }
public bool PropB { get; set; }
public bool PropC { get; set; }
}
public class DtoClass
{
public FlagEnum FlagEnum { get; set; }
public DtoClass(LegacyClass legacyClass)
{
if (!legacyClass.PropA && !legacyClass.PropB && !legacyClass.PropC)
{
throw new ArgumentException();
}
if (legacyClass.PropA)
{
FlagEnum = FlagEnum.EnumValue1;
}
if (legacyClass.PropB)
{
if (legacyClass.PropA)
{
FlagEnum = FlagEnum.EnumValue1|FlagEnum.EnumValue2;
}
else
{
FlagEnum = FlagEnum.EnumValue2;
}
}
if (legacyClass.PropC)
{
if (legacyClass.PropA||legacyClass.PropB)
{
FlagEnum = FlagEnum | FlagEnum.EnumValue3;
}
else
{
FlagEnum = FlagEnum.EnumValue3;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
考虑到我可能遇到更多属性和标志设置的案例,是否有更优雅或简洁的方法来做到这一点?
Fre*_*dou 11
怎么样这样的?
using System;
namespace ConsoleApplication1
{
[Flags]
public enum FlagEnum
{
EnumValue1 = 1,
EnumValue2 = 2,
EnumValue3 = 4
}
public static class LegacyClass
{
public static bool PropA { get; set; }
public static bool PropB { get; set; }
public static bool PropC { get; set; }
}
class Program
{
static void Main(string[] args)
{
LegacyClass.PropB = true;
FlagEnum result = LegacyClass.PropA ? FlagEnum.EnumValue1 : 0;
result |= LegacyClass.PropB ? FlagEnum.EnumValue2 : 0;
result |= LegacyClass.PropC ? FlagEnum.EnumValue3 : 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以将代码算术与小函数结合使用以简化代码,而不是在代码中使用分支:
T GetFlag<T>(Boolean value, T flag) {
return value ? flag : default(T);
}
Run Code Online (Sandbox Code Playgroud)
要计算枚举值,您可以使用以下表达式:
var flagEnum = GetFlag(legacyClass.PropA, FlagEnum.EnumValue1)
| GetFlag(legacyClass.PropB, FlagEnum.EnumValue2)
| GetFlag(legacyClass.PropC, FlagEnum.EnumValue3);
Run Code Online (Sandbox Code Playgroud)
请注意,ArgumentException如果没有设置任何标志,您的代码将抛出.此代码将改为计算default(FlagEnum)在这种情况下为0.
| 归档时间: |
|
| 查看次数: |
6270 次 |
| 最近记录: |