2016-05-12 6 views
1

[Flag]属性を持つenumを定義しました。Where on Enum値を使用する

与えられた整数値では、整数値に設定されたビットのすべてのenum値を出力したいと思います。

これまで私がこれまで持っていたことは次のとおりです。

string s = string.Join(", ", Enum.GetValues(typeof(MyEnumType)).OfType<Enum>() 
           .Where(x => (MyIntValue & (int)x) != 0)); 

しかし、最後の行でintに型キャストは私に、次のエラーが発生します。

私は、MicrosoftがLINQをサポートするタイプの賛成でArrayを返し、すべてのフレームワークのコードを置き換えてほしい "int型

に型「System.Enum」に変換できません。

しかし、これを行う簡単な方法はありますか?

+1

なぜ行わない '.OfType ()'の代わりに '.OfType ()'の? –

+0

あなたのint値を列挙型にキャストし、ToString()を呼び出すことは、あなたが望むものを正確に行うはずです。 http://stackoverflow.com/questions/8447/what-does-the-flags-enum-attribute-mean-in-c?rq=1 – devio

+0

を参照してください。「MicrosoftがArrayを返すすべてのフレームワークコードを置き換えることを希望しますLINQをサポートするタイプの " Linqの前に書かれたすべてのレガシーコードについて、彼らは何をすべきでしょうか?何年にもわたって開発されたコードが突然壊れてしまいましたか? –

答えて

2

あまりにも多くのLINQの道なので、時々:そのように同じように使用されて

public static class EnumUtil 
{ 
    public static IEnumerable<T> GetValues<T>() 
    { 
     foreach(T enumVal in Enum.GetValues(typeof(T))) 
     { 
      yield return enumVal; 
     } 
    } 
} 

最初の.NETバージョンから、Enum.GetValues(typeof(MyEnum))が実際にMyEnum[]を返すので、OfTypeでもCastでもなく、単純なC#cast

string s = string.Join(", ", ((MyEnum[])Enum.GetValues(typeof(MyEnumType))) 
    .Where(x => (MyIntValue & (int)x) != 0)); 

同じ型にキャストと組み合わせることtypeofは私が私のポケットの中にこの小さなヘルパーを持っている非常に長い時間から、非常に迷惑ですので:

私は使用することができます
public static class EnumInfo 
{ 
    public static T[] GetValues<T>() where T : struct // I (and not only) wish I could say where T : enum 
    { 
     return (T[])Enum.GetValues(typeof(T)); 
    } 
} 

はるかに簡潔

string s = string.Join(", ", EnumInfo.GetValues<MyEnumType>() 
    .Where(x => (MyIntValue & (int)x) != 0)); 
+0

'GetValues()'メソッドは 'T'以外の何かを返すべきではありませんか?たとえば、 'T []'? –

+0

@JonathanWood絶対に、ありがとうございます(ブラウザにコードを直接書くときはどうですか)。 –

3

問題を修正する必要があります代わりに、一般的なEnumMyEnumTypeにキャスト:あなたはアイテムがタイプMyEnumTypeであることを確信しているので、あなたが本当にCast代わりのOfTypeを使用する必要があります

string s = string.Join(
    ", ", 
    Enum.GetValues(typeof(MyEnumType)) 
     .OfType<MyEnumType>() 
     .Where(x => (MyIntValue & (int)x) != 0)); 

+0

ええ、そうです。このコードはあまりにも厄介で実行が遅すぎます。 MicrosoftはFrameworkを更新する必要があります。ありがとう。 –

+0

あなたは歓迎です –

+0

@JonathanWood「遅すぎる」とはどの部分が実行され、どのようにMicrosoftが修正することを提案しますか? –

0

あなたはあなたが必要なものを得るためにジェネリックを使用して、独自のGetValuesメソッドを書くことができます:思考の

var s = string.Join(", ", EnumUtil.GetValues<TestEnum>() 
    .Where(x => (myIntValue & (int)x) != 0)); 
関連する問題