internal static void ForeachDoaction(this MyBitFlag e, System.Action <MyBitFlag> action)
 {
     if (action == null)
     {
         System.Console.WriteLine("Fail. Action is null.");
         return;
     }
     //取决于基础类型, int循环32次, 他共有32bits
     for (uint i = 1; i != 0; i <<= 1)
     {
         uint m = (uint)e & i; //如果这一位为open
         if (m != 0)
         {
             action((MyBitFlag)m);
         }
     }
 }
 //向Enum添加方法
 internal static MyBitFlag Clear(this MyBitFlag e, MyBitFlag flag)
 {
     return(e & (~flag));
 }
        static void Main15(string[] args)
        {
            Console.WriteLine(Enum.GetUnderlyingType(typeof(MyEnum)));

            #region Enum <-> number / Enum -> string
            //MyEnum的实例其实就是一个byte
            MyEnum me = (MyEnum)23;

            //查看一个enum实例的方法
            Console.WriteLine(me.ToString());                              //Enum重写了Object.Tostring, 虽然enum实例是个数字, 但返回的是对应的变量名A
            Console.WriteLine(me.ToString("D"));                           //查看常量值的十进制
            Console.WriteLine(me.ToString("X"));                           //查看常量值的十六进制
            Console.WriteLine(Enum.Format(typeof(MyEnum), (Byte)23, "G")); //静态方法, 不通过实例

            Console.WriteLine("\r\nDisplay the values, 因为ToString被重写, 打印出来的是常量数值的符号名");
            Array arr = Enum.GetValues(typeof(MyEnum)); //Array是个抽象基类, GetValue返回子类, MyEnum[]
            foreach (var b in arr)
            {
                Console.WriteLine(b);
            }
            Console.WriteLine("\r\nDisplay the names");
            string[] names = Enum.GetNames(typeof(MyEnum));
            foreach (string s in names)
            {
                Console.WriteLine(s);
            }
            #endregion

            #region string -> enum
            Console.WriteLine("\r\n\r\n");
            //Parse方法, 本质是string->object
            MyEnum e = (MyEnum)Enum.Parse(typeof(MyEnum), "A");
            Console.WriteLine(e.ToString("D"));

            //检查是否有定义
            if (Enum.IsDefined(typeof(MyEnum), "s"))
            {
                Console.WriteLine("Name is defined");
            }
            else
            {
                Console.WriteLine("Name is not defined");
            }
            #endregion

            #region Bit Flag
            //展示内置bit flag的一个有关文件操作的内容
            //获得.exe的位置
            string path = System.Reflection.Assembly.GetEntryAssembly().Location;
            Console.WriteLine(path);
            System.IO.FileAttributes fa = System.IO.File.GetAttributes(path);
            Console.WriteLine("Is the file read only?");
            Console.WriteLine(fa);
            Console.WriteLine((fa & System.IO.FileAttributes.ReadOnly) != 0);

            //Bit flag的特点是查找时要考虑几个选项组合的结果
            //bit flag -> string
            Console.WriteLine("\r\n" + (MyBitFlag)3);           //3 -> 1|2 -> ToString -> Layer1,Layer2
            Console.WriteLine(((MyBitFlag)0x3F).ToString("F")); //"F"格式和[Flags]类似

            //string -> bit flag
            MyBitFlag mb = (MyBitFlag)Enum.Parse(typeof(MyBitFlag), "Layer1 , Layer2 "); //内部空格会被切掉
            Console.WriteLine(mb.ToString("D"));
            //Parse有报错可能 - 无法找到时
            #endregion

            #region 通过extention method向enum中添加方法
            MyBitFlag m = MyBitFlag.Layer6 | MyBitFlag.Layer3;
            m.ForeachDoaction((MyBitFlag mf) => { Console.WriteLine("Foreach Print: " + mf.ToString()); });
            #endregion
        }