[Flags]
enum MultiHue{ Black = 0, Red = 1, Green = 2, Blue = 4}MultiHue a = MultiHue.Black | MultiHue.Green;
这里怎么写代码遍历a,得到Black和Green 2个结果
我想到的办法,除了switch 0,1,2,3,4,5,6,7之外,就是下面的方案了:
int b = (int)a;
while(b>0){
  MultiHue c = (MultiHue)(b&1);
  b = b >> 1;
}有没有更简单的,比如能不能直接foreach?

解决方案 »

  1.   

    Type t = typeof(枚举);
        foreach (string s in Enum.GetNames(t))
        {
            Console.WriteLine("值: 0x{0:X2}  名称: {1}", (int)Enum.Parse(t, s), s);
        }
      

  2.   


    class Program
        {
            enum MultiHue { Black = 0, Red = 1, Green = 2, Blue = 4 }
            static void Main(string[] args)
            {
                MultiHue Myenum = new MultiHue();
                foreach (string enumItem in Enum.GetNames(Myenum.GetType()))
                {
                    Console.WriteLine(enumItem);
                }
                Console.ReadKey();
            }
        }
      

  3.   

    MultiHue a = MultiHue.Black | MultiHue.Green;
    这里怎么写代码遍历a,得到Black和Green 2个结果而不是遍历枚举的定义,谢谢各位,请看清问题
      

  4.   

    [Flags]
    enum MultiHue{ Black = 0, Red = 1, Green = 2, Blue = 4}MultiHue a = MultiHue.Red | MultiHue.Green;
     Console.WriteLine(a.ToString());这样直接就会有结果的,包含0的不好判断http://msdn.microsoft.com/zh-cn/library/cc138362.aspx
      

  5.   

    本来写个方法分拆枚举,结果发现enum还不能作为泛型条件
    即 List<T> GetEnumList<T>(T t) where T:Enum 会编译出错
      

  6.   

    暂时用int代替参数值:
    //根据枚举值组合,返回枚举明细项
    public static List<int> GetEnumList(int enumInt)
    {
        if (enumInt <= 0)
            return null;    List<int> ret = new List<int>();
        int clear = 1;  // 用于屏蔽其它无效二进制位
        while (clear <= enumInt)
        {
            int item = (enumInt & clear);
            ret.Add(item);        clear = clear << 1;
        }
        return ret;
    }
      

  7.   

    我是真正懂楼主的需求
    另外,可以按位域组合的,第一项不能为0,比如:
    M m =M.Green, 这时候它与 M m=M.Green|M.Black是一样的效果,二义性了
    所以,我将楼主的枚举第一项改为1了判断代码如下:[Flags]
        enum M { Black = 1, Red = 1, Green = 2, Blue = 4 }
        class Program
        {
            static void Main(string[] args)
            {
                M m = M.Black | M.Red;
                Type t = typeof(M);
                string[] items = Enum.GetNames(t);
                foreach (string s in items)
                {
                   M n = (M)Enum.Parse(t, s);
                   if ((m & n) > 0)
                   {
                       Console.WriteLine("M has:" + s);
                   }
                }
            }
        }
      

  8.   

    枚举内容应该如下:
    enum M { Black = 0001B, Red = 0010B, Green = 0100B, Blue = 1000B }
      

  9.   


    MultiHue[] GetFlags(MultiHue value)
    {
        return Enum.GetValues(typeof(MultiHue))
            .OfType<MultiHue>()
            .Where(t => (t & value) == t)
            .ToArray();
    }
      

  10.   

    http://dotnetperls.com/enum-flags
    http://www.cnblogs.com/kriss/archive/2005/02/04/101905.html
      

  11.   

    重新写了个泛型方法来实现我的目的,呵呵
    /// <summary>
    /// 根据枚举值组合,返回枚举明细项
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    /// <returns></returns>
    public static List<T> GetEnumList<T>(T obj) where T : struct
    {
        int objInt = Convert.ToInt32(obj);
        Type type = typeof(T);
        List<T> ret = new List<T>();
        if (!type.IsEnum)
        {
            throw new ArgumentException("参数必须是枚举类型");
        }
        foreach (T t in Enum.GetValues(type))
        {
            int tmp = Convert.ToInt32(t);
            if (tmp == 0)//枚举值为0,不处理
                continue;
            if ((tmp & objInt) == tmp)
            {
                ret.Add(t);
            }
        }
        return ret;
    }