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から:

フラグの基になる値がゼロの場合、メソッドはtrueを返します。この動作が望ましくない場合は、Equalsメソッドを使用してゼロとの同等性をテストし、フラグの基になる値がゼロ以外の場合にのみHasFlagを呼び出すことができます。

于 2012-10-05T04:29:21.900 に答える
1

FontStyle.Regular == 0&したがって、 0(バイナリおよび)はすべて0であるため、この列挙型の値には常に「存在」します。

value &  FontStyle.Regular == FontStyle.Regular 

ニーズに応じて、Flags列挙の0の値を明示的に無視するかif、スタイルを明示的に行うことができます。

于 2012-10-05T04:29:26.317 に答える
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 に答える