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

Sco*_*000 1 c# enums

我有一个类似以下的场景,我有一个枚举,我得到了一些经过解析的文本,以创建一个枚举的列表,我想将其传递到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)

AAA*_*ddd 7

由于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按位运算。在位标志枚举中,包括一个值为零的命名常量,表示“未设置标志”。