说,我们有一个字体:
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);
}
这是一种方式。但
FontStyle.Regular
。为什么?答案 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)))