枚舉:Enum-Int-String之間的轉換與擴展
示例枚舉:
public enum Color
{
[Description("紅色")]
Red,
[Description("綠色")]
Green = 7,
[Description("藍色")]
Blue
}
Enum轉Int
int red = (int)Color.Red;//0
int green = (int)Color.Green;//7
int blue = (int)Color.Blue;//8
- 枚舉類型默認為Int
- 枚舉值默認從0開始,並依次遞增
Int轉Enum
Color a = (Color)5;//不報錯
Color b = (Color)7;
Console.WriteLine(a.ToString());//5
Console.WriteLine(b.ToString());//Green
- Int 可以直接轉 Enum
- 枚舉可能會得到非預期的值(值沒有對應的成員),不會報錯
Enum轉String
var red = Color.Red.ToString();//Red
var green = Color.Green.ToString();//Green
var blue = Color.Blue.ToString();//Blue
String轉Enum
var green = Enum.Parse(typeof(Color), "Green");//Color.Green
var black = Enum.Parse(typeof(Color), "Black");//throw ArgumentException
Enum.TryParse<Color>("Black", out var blackTry);//Color.Red
- 和枚舉名相同的字符可以轉成相對應的枚舉(區分大小寫)
- 轉化不存在的字符,會拋出異常(不同於Int)
- 使用Enum.TryParse轉換,不存在,則返回默認枚舉
- 枚舉的默認值 0,即使沒有為0的成員
讀取Description
當我需要展示枚舉 Int 和 枚舉名以外的信息時,可以使用 DescriptionAttribute 屬性,設置描述信息然後讀取
/// <summary>
/// 獲取枚舉的描述
/// </summary>
/// <param name="enum">枚舉值</param>
/// <returns>description</returns>
public static string ToDescription(this Enum @enum)
{
MemberInfo[] member = @enum.GetType().GetMember(@enum.ToString());
if (member.Length != 0)
{
string description = GetDescription(member[0]);
if (description != null)
{
return description;
}
}
return @enum.ToString();
}
/// <summary>
/// 獲取成員信息的 Description
/// </summary>
/// <param name="memberInfo">成員信息</param>
/// <returns>Description</returns>
private static string GetDescription(MemberInfo memberInfo)
{
var type = typeof(DescriptionAttribute);
var attribute = memberInfo.GetCustomAttribute(type) as DescriptionAttribute;
return attribute?.Description;
}
var red = Color.Red.ToDescription();//紅色
var green = Color.Green.ToDescription();//綠色
var blue = Color.Blue.ToDescription();//藍色
枚舉的擴展方法
示例代碼://gitee.com/sayook/Extensions/blob/master/Extensions/EnumExtensions.cs
相關好文://mp.weixin.qq.com/s/f9Wc3kIKF4K1zHkHuHyp3w