我有一个类似以下的场景,我有一个枚举,我得到了一些经过解析的文本,以创建一个枚举的列表,我想将其传递到ReportResults中,该列表将根据传递的标记来创建电子邮件。我没有访问以更改枚举或ReportResults方法,是否可以传递诸如resultFlags变量之类的内容?有没有一种方法可以使用Enum.TryParse创建要传递的单个项目?(在某些时候,序列化需要这样的东西)
[Flags]
public enum Result
{
None = 0,
Warning = 2,
Error = 4,
Success = 8,
Failure = 16
}
public void ProcessResultValues(string log)
{
var resultFlags = new List<Result>();
/// Process log text, add Result flags to the resultFlags list
ReportResults(resultFlags);
}
public void ReportResults(Result results)
{
/// Based on the flags, generate a text to describe if the process succeeded or failed and if there were any warnings or errors encountered during processing.
}
Run Code Online (Sandbox Code Playgroud)
由于Result已正确设置为位标记枚举(这意味着一个枚举变量可以容纳多个枚举值),因此您可以将or它们放在一起以获得一个组合的枚举来传递。最简单的方法是使用Enumerable。汇总方法
将累加器函数应用于序列。
var result = resultFlags.Aggregate((x, y) => x |= y);
Run Code Online (Sandbox Code Playgroud)
与手动组合它们相同,例如
Days meetingDays = Days.Tuesday | Days.Thursday;
Run Code Online (Sandbox Code Playgroud)
位标记起作用的原因是数字的布局方式,每个值不是互斥的,并且可以使用按位运算轻松地以二进制形式打包和解包(因此命名为bit flag)。他们已经永远存在了。
进一步阅读
您可以使用枚举类型来定义位标志,这使枚举类型的实例可以存储在枚举器列表中定义的值的任何组合
您可以通过应用System.FlagsAttribute属性并适当定义值来创建位标志枚举,以便可以对它们执行AND,OR,NOT和XOR按位运算。在位标志枚举中,包括一个值为零的命名常量,表示“未设置标志”。