2

私は列挙型を書きました:

[Flags]
public enum BundleOS {
    Win32 = 0,
    Win64 = 1,
    Mac = 2
}

文字列から解析し、文字列に書き込む必要があります。文字列のサンプル: "Win32|Win64". 次のコードは無効な結果を返します:

BundleOS os;
Boolean result = TryParse<BundleOS>("Win32|Win64", out os);

result変数で値を取得しましたfalse。しかし、私には が必要trueであり、os値には値が必要BundleOS.Win32|BundleOS.Win64です。


そのような操作を行う場合:

String x = (BundleOS.Win32|BundleOS.Win64).ToString();

そのような値を取得する必要があります: "Win32|Win64"、しかし取得し"Win64"ます。

これらの問題の簡単な解決策はありますか?

4

4 に答える 4

13

あなたの問題は、ビット単位の操作を実行し、Win32 が 0 に等しいことです
Win64 OR Win32実際にはWin64 OR 0どちらが を返しますWin64

次のように列挙型を設定できます。

[Flags]
public enum BundleOS 
{
     Win32 = 1,
     Win64 = 2,
     Mac = 4
}

余談ですが、今週初めにフラグ列挙型を定義する方法について尋ねられた非常に良い質問も指摘します。

于 2012-11-07T11:17:55.667 に答える
2

特定のフラグに関する@Blachshmaの回答に加えて、文字列形式を"Win32|Win64"取得して列挙型の実際のインスタンスに変換する場合は、もう少し作業が必要です。

まずsplit()、個々の値を取得するには、文字列を「|」で囲みます。

次に、 and を使用して、元の列挙型の要素の名前と値のリストを取得できEnum.GetNames()ますEnum.GetValues()。次に、分割されたコンポーネントをループして、元の列挙型から一致するエントリ (およびその値) を見つけることができます。

于 2012-11-07T11:23:36.677 に答える
2

これを試して、フラグ文字列を解析してください。私はテストしていませんが、それはあなたを始めるはずです:

BundleOS flags = "Win32|Win64"
                    .Split('|')
                    .Select(s => (BundleOS)Enum.Parse(typeof(BundleOs), s))
                   .Aggregate((f, i) => f|i);
于 2012-11-07T11:25:03.433 に答える
0

Blachshma の回答に加えて、実際の MSDN ドキュメントではFlagsAttribute、「FlagsAttribute と Enum のガイドライン」セクションで非常に簡潔に説明されています。

2 の累乗、つまり 1、2、4、8 などで列挙定数を定義します。これは、組み合わせた列挙定数の個々のフラグが重複しないことを意味します。

値がゼロのフラグ列挙定数の名前として None を使用します。ビットごとの AND 演算で None 列挙型定数を使用してフラグをテストすることはできません。これは、結果が常に 0 であるためです。ただし、数値と None 列挙定数との間で、ビット単位ではなく論理比較を実行して、数値のビットが設定されているかどうかを判断できます。

于 2012-11-07T11:34:09.950 に答える