列挙値に設定されているすべてのビットの名前を一覧表示するためのヘルパーメソッドを作成しようとしています(ログ記録の目的で)。いくつかの変数に設定されているすべての列挙値のリストを返すメソッドが必要です。私の例では
[Flag]
Enum HWResponse
{
None = 0x0,
Ready = 0x1,
Working = 0x2,
Error = 0x80,
}
私はそれに0x81を供給します、そしてそれは私にIEnumerable<HWResponse>
含むことを提供するはずです{Ready, Error}
。
もっと簡単な方法が見つからなかったので、以下のコードを書いてみましたが、コンパイルできません。
public static IEnumerable<T> MaskToList<T>(Enum mask)
{
if (typeof(T).IsSubclassOf(typeof(Enum)) == false)
throw new ArgumentException();
List<T> toreturn = new List<T>(100);
foreach(T curValueBit in Enum.GetValues(typeof (T)).Cast<T>())
{
Enum bit = ((Enum) curValueBit); // Here is the error
if (mask.HasFlag(bit))
toreturn.Add(curValueBit);
}
return toreturn;
}
このバージョンのコードでは、コンパイラーはTを列挙型にキャストできないと文句を言います。
私は何を間違えましたか?これを行うためのより良い(より簡単な)方法はありますか?どうすればキャストを作ることができますか?
また、私はメソッドを次のように書いてみました
public static IEnumerable<T> MaskToList<T>(Enum mask) where T:Enum
ただし、列挙型は「where」構文を禁止する特別なタイプです(C#4.0を使用)