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

我有一个类似以下的场景,我有一个枚举,我得到了一些经过解析的文本,以创建一个枚举列表,我想将其传递到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.
    }
yuanyuanlizhu 回答:如何创建枚举标志的动态列表,然后传递给另一种方法

由于Result被正确设置为位标志枚举(这意味着一个枚举变量可以容纳多个枚举值),因此您可以将它们or一起使用获得单个组合的 enum 来传递。最简单的方法是使用Enumerable. Aggregate方法

  

在序列上应用累加器功能。

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

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

Days meetingDays = Days.Tuesday | Days.Thursday;

位标志起作用的原因是数字的布局方式,每个值不是互斥的,并且可以使用按位运算轻松地打包和解包为二进制>(因此名为位标志)。他们已经永远存在了。


进一步阅读

Enumeration types as bit flags

  

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

     

通过应用System.FlagsAttribute创建位标志枚举   属性并适当定义值,以便AND,OR,NOT   并可以对其执行XOR按位运算。有点标志   枚举,包括一个值为零的命名常量,表示“否   标志已设置。”

,

您可以尝试执行此操作,但是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

如果“无”为0:

None
Warning
Success
本文链接:https://www.f2er.com/3148908.html

大家都在问