目录
一、枚举
1、枚举是将变量的值罗列出来,变量的值只限于列举出来的值的范围。
2、枚举使用enum关键字来声明,与类同级。枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符。枚举本身的修饰符仅能使用public和internal。
3、枚举是值类型。
4、枚举是隐式密封的,不允许作为基类派生子类。
5、枚举类型的枚举成员均为静态,默认为Int32类型。
6、枚举成员不能相同,但枚举的值可以相同。
7、枚举成员是该枚举类型的命名常数。任意两个枚举成员不能具有相同的名称。每个枚举成员均具有相关联的常数值。此值的类型就是枚举的基础类型。每个枚举成员的常数值必须在该枚举的基础类型的范围之内。
二、声明枚举
1、不给成员赋值,成员的常数值默认从0开始。
public enum Week
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
2、给成员赋值,下一个成员的值为上一个成员值+1
public enum Number
{
One = 1,
Two,
Three,
Seven = 7,
Eight,
Nine
}
3、枚举可以继承byte、sbyte、short、ushort、 int、 uint、long 或 ulong
public enum Month : byte
{
January,
February,
March,
April,
May,
June,
July,
August,
September,
October,
November,
December
}
4、枚举成员的值可以等于某个成员加上一个值
public enum MachineState
{
PowerOff = 0,
Running = 1,
Sleeping = 2,
Hibernating = Sleeping + 3
}
5、自定义属性
[AttributeUsage(AttributeTargets.Field)]
public class EnumNote : Attribute
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="_note"></param>
public EnumNote(string _note)
{
Note = _note;
}
public string Note { get; set; }
}
public enum Week
{
[EnumNote("周日")]
Sunday
}
6、 DescriptionAttribute
public enum Week
{
[Description("周日")]
Sunday = 7
}
三、枚举的简单使用
1、转成整数
// 1
int i = (int)Week.Sunday;
// 2
int j = Week.Sunday.GetHashCode();
//输出 7
2、转成字符串
string s = Week.Sunday.ToString();
//输出 Sunday
3、GetName方法:在指定枚举中检索具有指定值的常数的名称。
string strToday = Enum.GetName(typeof(Week), 3);
//输出 Wednesday
4、GetNames方法: 检索指定枚举中常数名称的数组。
string[] array1= Enum.GetNames(typeof(Week));
Array array2 = Enum.GetNames(typeof(Week));
//new [] {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
5、GetUnderlyingType方法:返回指定枚举的基础类型。
Type type = Enum.GetUnderlyingType(typeof(Week));
6、GetValues方法:检索指定枚举中常数值的数组。
Array array3 = Enum.GetValues(typeof(Week));
7、Parse方法:将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。
string s1 = Enum.Parse(typeof(Week), "3").ToString();
//输出 Wednesday
int j = Convert.ToInt32(Enum.Parse(typeof(Week), "Wednesday"));
//输出 3
//默认第三个参数为false,当传true时忽略大小写
int k = Convert.ToInt32(Enum.Parse(typeof(Week), "wednesday", true));
//输出 3
8、Format方法:根据指定格式将指定枚举类型的指定值转换为其等效的字符串表示形式。
string s2 = Enum.Format(typeof(Week), 3, "G");
//输出 Wednesday
9、IsDefined方法:返回指定枚举中是否存在具有指定值的常数的指示。
bool b = Enum.IsDefined(typeof(Week), 3);
10、ToObject方法: 将具有整数值的指定对象转换为枚举成员。
string s3 = Enum.ToObject(typeof(Week),3).ToString();
11、TryParse方法:将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。
Week w;
bool b1 = Enum.TryParse<Week>("Wednesday", out w);
四、扩展方法
1、根据常数名称获取对应的常数值
public static Enum StrConvertEnum(this string str, Type type)
{
string[] enumNames = type.GetEnumNames();
Enum e = null;
foreach (var item in enumNames)
{
if (item == str)
{
e = (Enum)Enum.Parse(type, item);
break;
}
}
return e;
}
int i = "Wednesday".StrConvertEnum(typeof(Week)).GetHashCode();
//输出 3
2、获取属性
public static string GetNote(this Enum value)
{
Type type = value.GetType();
string name = Enum.GetName(type, value);
if (string.IsNullOrEmpty(name))
{
return null;
}
FieldInfo field = type.GetField(name);
EnumNote attribute = Attribute.GetCustomAttribute(field, typeof(EnumNote)) as EnumNote;
return attribute?.Note;
}
string note = "Wednesday".StrConvertEnum(typeof(Week)).GetNote();
//输出 周三