如何创建一个枚举标志的动态列表,然后传递到另一个方法中



我有一个类似以下的场景,我有一一个枚举,我得到一些文本,这些文本被解析以创建一个枚举列表,我想将其传递到ReportResults中,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.
}

由于Result被正确设置为位标志枚举(这意味着一个枚举变量可以容纳多个枚举值(,因此您可以将它们or放在一起,以获得单个组合的枚举

在序列上应用累加器函数。

var result = resultFlags.Aggregate((x, y) => x |= y);

这与手动组合它们相同,例如

Days meetingDays = Days.Tuesday | Days.Thursday;

位标志工作的原因是数字的排列方式,每个值都不是互斥的,可以使用逐位操作轻松地以二进制形式打包和解包(因此得名比特标志


进一步阅读

枚举类型作为位标志

您可以使用枚举类型来定义位标志,这将启用枚举类型的实例,以存储枚举器列表中定义的值

通过应用System.FlagsAttribute创建位标志枚举属性,并适当地定义值,以便and、OR、NOT并且可以对它们执行XOR位操作。In a bit flagsenum,包括一个值为零的命名常量,表示"no"设置了标志。">

您可以尝试此操作,但None值应该为1,因为如果为0,则标志将始终打开。

[Flags]
public enum Result
{
None = 1,
Warning = 2,
Error = 4,
Success = 8,
Failure = 16
}
public void ProcessResultValues(string log)
{
var resultFlags = new List<Result>();
// For test
resultFlags.Add(Result.Warning);
resultFlags.Add(Result.Success);
Result results = default(Result);
resultFlags.ForEach(value => results |= value);
ReportResults(results);
}
public void ReportResults(Result results)
{
// For test
foreach ( Enum value in Enum.GetValues(typeof(Result)) )
if ( results.HasFlag(value) )
Console.WriteLine(value);
}

输出

Warning
Success

如果None为0:

None
Warning
Success

相关内容

最新更新