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;
  }
}

您只需要一个参数,就像您在枚举值上调用它一样。例子:

[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 回答