2

说,我们有一个字体:

        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. 有没有更好的方法来完成任务?
4

3 回答 3

3

方法的文档HasFlag

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

于 2012-10-05T04:29:21.900 回答
1

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

FontStyle 枚举足够短,我只需对每个案例进行编程,而不是使用 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)))
于 2012-10-05T04:51:59.417 回答
1

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

value &  FontStyle.Regular == FontStyle.Regular 

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

于 2012-10-05T04:29:26.317 回答