2012-10-05 46 views
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. 有沒有更好的方法來完成這項任務?
+0

你爲什麼想每個款式?如果你只是想打印它,我建議'style.ToString(「F」)'。如果您需要對列表中的每種樣式進行操作,請將您的where語句更新爲'.Where(fs => fs!= FontStyle.Regular && f.Style.HasFlag(fs)))' – Trisped

+0

@Trisped我正在製作自定義字體編輯器,我想有一個CheckedListBox來編輯字體樣式。根據'Font'實例,它會檢查必要的項目。所以我需要從'font.Style'中提取值。 – horgh

+0

對不起,試圖刪除評論,但我的電腦崩潰了(不喜歡從休眠狀態喚醒)。請參閱下面我的建議答案。 – Trisped

回答

1

FontStyle.Regular == 0。因此,這將是在此枚舉類型的值總是「現在」,因爲任何& 0(二進制和)爲0

value & FontStyle.Regular == FontStyle.Regular 

根據您的需求,您可以explcitly忽略的Flags枚舉值0或做明確的if樣式。

3

docs for the HasFlag method

如果flag的基本值是零,則該方法返回true。如果 這種行爲是不可取的,你可以使用Equals方法來測試 平等與零和呼叫HasFlag只有標誌的基礎值 非零

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)))