1. 重要
1.1. Color.Red.ToString()
1.2. Color.Red.GetHashCode()
2. 基础知识
2.1. 相关概念
枚举类型(enum type)是具有一组命名常量的独特的值类型。在以下示例中:
enum Color
{
Red,
Green,
Blue
}
声明一个名为 Color 的枚举类型,该类型具有三个成员:Red、Green 和 Blue。 枚举具体是怎么声明呢?枚举声明用于声明新的枚举类型。枚举声明以关键字 enum 开始,然后定义该枚举类型的名称、可访问性、基础类型和成员。具体格式:
修饰词(new、public、protected、internal、private)enum 枚举类型名:整数类型
{
enum-member-declarations,
enum-member-declaration
}
3. 枚举的定义,枚举的用法,获取枚举值
3.1. 定义枚举类型
public enum Test
{
男 = 0,
女 = 1
}
3.2. 获取枚举值
public void EnumsAction()
{
var s = Test.男;//男
var s2 = (int)Test.男;//0
var a = Test.男.ToString();//"男"
var r = (Test)1;//女
var x = (Test)Enum.Parse(typeof(Test), "男");//男
var x2 = Enum.Parse(typeof(Test), "男");//男
var x3 = Enum.GetName(typeof(Test),0);//"男"
foreach (var item in Enum.GetValues(typeof(Test)))
{
var v = item;//男[女]
var v2 = (int)item;//0[1]
var t = item.GetType();//{Name = "Test" FullName = "BaseControl.Enum.Test"}
var g = item.ToString();//"男"["女"]
}
}
对于typeof的解释:https://wenda.so.com/q/1365708081065503?src=150
C# typeof() 和 GetType()区是什么?
1、typeof(x)中的x,必须是具体的类名、类型名称等,不可以是变量名称。
2、GetType()方法继承自Object,所以C#中任何对象都具有GetType()方法,它的作用和typeof()相同,返回Type类型的当前对象的类型。
比如有这样一个变量i:
Int32 i = new Int32();
i.GetType()返回值是Int32的类型,但是无法使用typeof(i),因为i是一个变量,如果要使用typeof(),则只能:typeof(Int32),返回的同样是Int32的类型。
附上另一篇枚举详解:https://www.cnblogs.com/eggTwo/p/5950131.html
4. 枚举的描述属性
在使用枚举类型时,我们需要取名称和值,甚至有时候还需要取枚举类型的描述。通过反射,我们能获取到枚举类型的描述属性。
- 首先我们需要给枚举类型添加描述属性(属性都没有是不可能取到的),[Description]就是描述属性,使用这个属性,我们需要添加 using System.ComponentModel 引用。
public enum EnumSex
{
/// <summary>
/// 男
/// </summary>
[Description("男")]
Male = 0,
/// <summary>
/// 女
/// </summary>
[Description("女")]
Female = 1
}
- 接着我们需要写一个获取描述属性的方法,FieldInfo需要添加 using System.Reflection 引用,DescriptionAttribute需要添加 using System.ComponentModel 引用。
public string GetEnumDescription(Enum enumValue)
{
string value = enumValue.ToString();
FieldInfo field = enumValue.GetType().GetField(value);
object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false); //获取描述属性
if (objs == null || objs.Length == 0) //当描述属性没有时,直接返回名称
return value;
DescriptionAttribute descriptionAttribute = (DescriptionAttribute)objs[0];
return descriptionAttribute.Description;
}
- 好了,现在我们可以获取到枚举的描述了
同理,我们可以给枚举类型赋上其他类型的属性,比如Obsolete,在GetEnumDescription方法里面将DescriptionAttribute换成ObsoleteAttribute,一样可以取到属性。