c# - 从枚举标志中获取所有设置的枚举名称

标签 c# enums flags

如何将返回的枚举值转换为其整数值?

我想获取在 _allVisibleDays 枚举中设置的所有标志作为整数值,就像:

TuesdayWednesday 已设置,然后我想将这些名称转换为 DayOfWeek 枚举以获取整数值:

所以 Tuesday 返回 2Wednesday 3 而不是 2 并且以下枚举的 4

我在SO上找到了这个方法:

public IEnumerable<int> GetFlags()
{
   foreach (Enum value in Enum.GetValues(typeof(VisibleDayOfWeek)))
     if (_allVisibleDays.HasFlag(value))
       yield return (int) value;
}

但我不能让它仅仅用于将枚举(上面的值)转换为整数的简单示例...

private VisibleDayOfWeek _allVisibleDays;


        [Flags]
        enum VisibleDayOfWeek : int
        {
            None = 0,
            Monday = 1, 
            Tuesday = 2,
            Wednesday = 4,
            Thursday = 8,
            Friday = 16,
            Saturday = 32,
            Sunday = 64
        }

最佳答案

由于您的 VisibleDayOfWeek 是一个 Flags 枚举,并且 DayOfWeek不是,两者没有直接对应的翻译(比如VisibleDayOfWeek.Friday是16,而DayOfWeek.Friday是5)。特别是因为这些只是一周中的几天并且将来可能不会改变(我希望!)我认为这里最好的选择就是编写一个带有检查的简单实用方法:

public IEnumerable<DayOfWeek> ConvertFromVisible(VisibleDayOfWeek visibleDay)
{
    if ((visibleDay & VisibleDayOfWeek.Monday) == VisibleDayOfWeek.Monday)
        yield return DayOfWeek.Monday;

    if ((visibleDay & VisibleDayOfWeek.Tuesday) == VisibleDayOfWeek.Tuesday)
        yield return DayOfWeek.Tuesday;

    if ((visibleDay & VisibleDayOfWeek.Wednesday) == VisibleDayOfWeek.Wednesday)
        yield return DayOfWeek.Wednesday;

    if ((visibleDay & VisibleDayOfWeek.Thursday) == VisibleDayOfWeek.Thursday)
        yield return DayOfWeek.Thursday;

    if ((visibleDay & VisibleDayOfWeek.Friday) == VisibleDayOfWeek.Friday)
        yield return DayOfWeek.Friday;

    if ((visibleDay & VisibleDayOfWeek.Saturday) == VisibleDayOfWeek.Saturday)
        yield return DayOfWeek.Saturday;

    if ((visibleDay & VisibleDayOfWeek.Sunday) == VisibleDayOfWeek.Sunday)
        yield return DayOfWeek.Sunday;
}

这样做的好处是可以自动返回 DayOfWeek 枚举,而不是稍后转换的整数。

此外,由于这跳过了反射,因此它应该具有更高的性能以及更能抵抗值的变化(尽管我怀疑这无论如何都会发生)。

编辑:如果你想调整它们返回的顺序(比如你想从周日开始到周六),你可以轻松地改变上面几行的顺序。

关于c# - 从枚举标志中获取所有设置的枚举名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15598623/

相关文章:

c# - 如何基于 URL 使用 Moq 对 HttpClient (HttpMessageHandler) 进行单元测试

c# - SQLite 加密因平台而异

c++ - 嵌套枚举的前向声明

java - 评估 switch 中的枚举

Java - 枚举作为可选

c# - 使用 C# 和 MonoTouch 制作 iOS 库或框架

c# - OleDataAdapter Fill 方法将空行返回到数据表

bash - 取消设置已由别名设置的标志

java - REGEX 从控制台命令获取标志?

user-interface - 对象编辑和 isDirty() 标志