0

このEnumクラスには、次の便利な機能があります。

public static Array GetValues(Type enumType);

すべての列挙型インスタンスのセットビットのコレクションを取得するために、どのように似たようなものを書くことができますか?次のような署名付き:

public static IEnumerable<T> getFlagValues<T>(this Enum enum, T enumInstance) where T : struct;

制約が許可されていないため、キャストを機能させるのに問題があります。Enumそのため、を使用する必要がありますstruct

4

2 に答える 2

2

私はあなたがこのように意味すると思います:

public static IEnumerable<T> getFlagValues<T>(this T enumValue) where T : struct {
  foreach (object o in Enum.GetValues(typeof(T))) {
    if (((int)o & (int)(object)enumValue) != 0) yield return (T)o;
  }
}

列挙値で呼び出すので、必要なパラメーターは1つだけです。例:

[Flags]
public enum X { a = 1, b = 2, c = 4 }

X x = X.a | X.c;

foreach (var n in x.getFlagValues()) {
  Console.WriteLine(n);
}

出力:

a
c
于 2013-03-04T01:34:12.220 に答える
1

これはあなたの状況でうまくいくかもしれません

public static IEnumerable<T> GetFlagValues<T>(this T enumValue) where T : struct
{
    return Enum.GetValues(typeof(T)).Cast<Enum>().Where(e => ((Enum)(object)enumValue).HasFlag(e)).Cast<T>();
}

テスト

[Flags]
public enum TestEnum
{
    One = 1,
    Two = 2,
    Three = 3
}

TestEnum test = TestEnum.One | TestEnum.Three;
var result = test.GetFlagValues();

戻り値

One
Three
One | Three
于 2013-03-04T01:53:44.873 に答える