如何解析枚举逻辑和?

时间:2012-10-05 04:10:33

标签: c# enums

说,我们有一个字体:

        Font f = new Font("Arial", 10, FontStyle.Italic | FontStyle.Bold);

如何完成其​​风格?

        foreach (FontStyle style in Enum.GetValues(typeof(FontStyle))
                                        .OfType<FontStyle>()
                                        .Where(fs => f.Style.HasFlag(fs)))
        {
            Console.WriteLine(style);
        }

这是一种方式。但

  1. 它也会返回FontStyle.Regular。为什么?
  2. 有没有更好的方法来完成任务?

3 个答案:

答案 0 :(得分:3)

来自docs for the HasFlag method

  

如果flag的基础值为零,则该方法返回true。如果   这种行为是不可取的,您可以使用Equals方法进行测试   与零相等并仅在基础值时调用HasFlag   标志是非零的

答案 1 :(得分:1)

FontStyle.Regular == 0。所以它总是“存在”这个枚举类型的值,因为任何& 0(二进制和)都是0。

value &  FontStyle.Regular == FontStyle.Regular 

根据您的需要,您可以明确忽略Flags枚举的0值或对样式执行显式if

答案 2 :(得分:1)

为什么你想要每种风格?如果您只想打印,我建议style.ToString("F")

FontStyle enumeration足够短,我只想编写每个案例,而不是使用LINQ和反射。他们不太可能会添加另一种样式,导致此代码需要更新。

if  (f.Style.HasFlag(FontStyle.Bold)) { Console.WriteLine(style); }
if  (f.Style.HasFlag(FontStyle.Italic)) { Console.WriteLine(style); }
if  (f.Style.HasFlag(FontStyle.Underline)) { Console.WriteLine(style); }
if  (f.Style.HasFlag(FontStyle.Strikeout)) { Console.WriteLine(style); }

否则更新你的where语句:

.Where(fs => fs != FontStyle.Regular && f.Style.HasFlag(fs)))