xiaolizi007
11/25/2016 - 6:01 AM

Enum

Enum #csharp

enum sex:byte
{
    male=0;
    female=1;
}

enum sexy:int
{
   male=0;
   female=1;
}

sex A=sex.male;  //A在栈中占用一个字节的位置
sexy B=sexy.male //B在栈中占用四个字节的位置 因为int是4字节整数


枚举类型默认时:public enum Icon_Type : int

byte 是 0~255之间的整数,int 是-2147483648~2147483647
//int string Enum之间的转换
class Program
    {
        static void Main(string[] args)
        {
            MyColor Page = (MyColor)1;
            //输出red
            Console.WriteLine(Page);

            MyColor Page2 = (MyColor)2;
            //输出2
            Console.WriteLine(Page2);

            //enum -> int
            int num = (int)Countries.中国;
            //num=5
            int[] nums = (int[])Enum.GetValues(typeof(Countries));
            //nums={5,6,7,8,9}
            //int -> enum
            Countries country = (Countries)8;
            //country=Countries.英国

            //enum -> string
            string str2 = Enum.GetName(typeof(Countries), 7);
            Console.WriteLine(str2);

            string[] strArray = Enum.GetNames(typeof(Countries));
            //strArray={"中国","美国","俄罗斯","英国","法国"};
            //string-> enum
            Countries myCountry = (Countries)Enum.Parse(typeof(Countries), "中国");
            //myCountry=Countries.中国
            Console.ReadKey();
        }
    }
enum MyColor { Red=1, Yellow=3, Blue=4 };
enum Countries
{
    中国 = 5,
    美国,
    俄罗斯,
    英国,
    法国
}
//Enum遍历
namespace Enum遍历
{
    enum aa { a = 1, b = 2,c= 3};
    class Program
    {
        static void Main(string[] args)
        {
            foreach (var a  in Enum.GetValues(typeof(aa)))
            {
                string s = $" {a} ";
                object num = a;
                string name = a.TpString();
                Console.WriteLine(s);
            }
            //上面输出的是  a  b  c
            foreach (int a in Enum.GetValues(typeof(aa)))
            {
                string s = $" {a} ";
                Console.WriteLine(s);
            }
            //上面这段代码输出的是 1  2   3
            //感觉这个可能是枚举类型的一个方法,虽然Enum.GetValues返回的是一个数组,但是这个数组
            //是string类型数组,还是int类型数组,是有var  或者int决定的
            Console.ReadKey();
        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Dynamic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp10
{
    class Program
    {
        static void Main(string[] args)
        {
            var list = EnumHelper.GetMemberValues<Test>();
            List<object> outobjects = new List<object>();
            foreach (var item in list)
            {
                dynamic d = new ExpandoObject();
                d.Name = item;
                d.Description = EnumHelper.GetDescription(EnumHelper.GetInstance<Test>(item.ToString()));
                outobjects.Add(d);
            }
            foreach (dynamic item in outobjects)
            {
                Console.WriteLine(item.Name);
                Console.WriteLine(item.Description);
            }
            Console.Read();
        }
    }
    public enum Test
    {
        [Description("sdfasdfa")]
        One,
        [Description("第二")]
        Two
    }

    public static class EnumHelper
    {
        public static string GetDescription(this Enum value)
        {
            Type type = value.GetType();
            string name = Enum.GetName(type, value);
            if (name != null)
            {
                FieldInfo field = type.GetField(name);
                if (field != null)
                {
                    DescriptionAttribute attr =
                          Attribute.GetCustomAttribute(field,
                            typeof(DescriptionAttribute)) as DescriptionAttribute;
                    if (attr != null)
                    {
                        return attr.Description;
                    }
                }
            }
            return null;
        }

        public static T GetInstance<T>(object member)
        {
            return GetInstance<T>(member.ToString());
        }

        public static T GetInstance<T>(string member)
        {
            return (T)Enum.Parse(typeof(T), member, true);
        }


        public static string[] GetMemberNames<T>()
        {
            return Enum.GetNames(typeof(T));
        }

        public static Array GetMemberValues<T>()
        {
            return Enum.GetValues(typeof(T));
        }

        public static Type GetUnderlyingType(Type enumType)
        {
            return Enum.GetUnderlyingType(enumType);
        }

        public static bool IsDefined<T>(string member)
        {
            return Enum.IsDefined(typeof(T), member);
        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp10
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(EnumHelper.GetDescription(Test.One));
            if (EnumHelper.IsDefined<Test>("Twoss"))
            {
                var ss = EnumHelper.GetInstance<Test>("Twoss");
            }
            else
            {
                Console.WriteLine("未定义这个数值");
            }
            var strs = EnumHelper.GetMemberNames<Test>();
            foreach (var item in strs)
            {
                Console.WriteLine(item);
            }
            Console.Read();
        }
    }
    public enum Test
    {
        [Description("sdfasdfa")]
        One,
        [Description("第二")]
        Two
    }

    public static class EnumHelper
    {
        public static string GetDescription(this Enum value)
        {
            Type type = value.GetType();
            string name = Enum.GetName(type, value);
            if (name != null)
            {
                FieldInfo field = type.GetField(name);
                if (field != null)
                {
                    DescriptionAttribute attr =
                          Attribute.GetCustomAttribute(field,
                            typeof(DescriptionAttribute)) as DescriptionAttribute;
                    if (attr != null)
                    {
                        return attr.Description;
                    }
                }
            }
            return null;
        }

        public static T GetInstance<T>(object member)
        {
            return GetInstance<T>(member.ToString());
        }

        public static T GetInstance<T>(string member)
        {
            return (T)Enum.Parse(typeof(T), member, true);
        }


        public static string[] GetMemberNames<T>()
        {
            return Enum.GetNames(typeof(T));
        }

        public static Array GetMemberValues<T>()
        {
            return Enum.GetValues(typeof(T));
        }

        public static Type GetUnderlyingType(Type enumType)
        {
            return Enum.GetUnderlyingType(enumType);
        }

        public static bool IsDefined<T>(string member)
        {
            return Enum.IsDefined(typeof(T), member);
        }
    }
}
//Flag位运算例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            Style ss = Style.ShowBorder | Style.ShowCaption;
            Console.WriteLine(ss.ToString());   //显示 : ShowBorder,ShowCaption
            int i = (int) ss;   //强制转换可以直接将位运算计算成计算结果
            Console.WriteLine(i);  //显示:3
            Style s2 = (Style)Enum.Parse(typeof(Style), ss.ToString());
            Console.WriteLine(s2);  //显示:ShowBorder,ShowCaption
            s2 = s2 & (~Style.ShowCaption); //从枚举的多个Flags状态中去掉一个元素。
            Console.WriteLine(s2);   // 显示: ShowBorder
            Console.Read();
        }
    }

    [Flags]
    enum Style
    {
        ShowBorder = 1, //是否显示边框
        ShowCaption = 2, //是否显示标题
        ShowToolbox = 4 //是否显示工具箱
    }
}
//DisplayName用法只能在配合MVC前台的  
//@Html.DisplayFor(modelItem => item.FlagsEnum)的时候显示,后台使用的还是Enum定义中的值
public enum MyEnum : byte
    {
        [Display(Name = "Zéro")]
        Zero,
    }
//为Enum写一个扩展方法
    public static string GetDescription(this Enum value)
    {
        Type type = value.GetType();
        string name = Enum.GetName(type, value);
        if (name != null)
        {
            FieldInfo field = type.GetField(name);
            if (field != null)
            {
                DescriptionAttribute attr =
                      Attribute.GetCustomAttribute(field,
                        typeof(DescriptionAttribute)) as DescriptionAttribute;
                if (attr != null)
                {
                    return attr.Description;
                }
            }
        }
        return null;
    }
//使用的例子如下:
public enum MyEnum{
    [Description("Description for Foo")]
    Foo,
    [Description("Description for Bar")]
    Bar
}

MyEnum x = MyEnum.Foo;string description = x.GetDescription();
// //只能使用enum,写Enum是错误的