枚举
- 枚举类型 是由基础整型,数值类型的一组命名常量定义的值类型。
- 若要定义枚举类型,请使用
enum
关键字并指定枚举成员 的名称。 - System.Enum 类型是所有枚举类型的抽象基类。
- 枚举类型可以 与 int类型相互转换。
下面通过代码来学习一下:
定义一个枚举
public enum Status
{
Hide =0,
Show =1
}
枚举默认是int类型,不过我们可以通过继承来修改:
public enum Status:short
{
Hide=0,
Show=1
}
枚举类型与数值类型的转换
Console.WriteLine((short)Status.Hide);
Console.WriteLine((Status)0);
字符串转换成枚举
//如果无法转换,会抛异常
Status t = (Status)Enum.Parse(typeof(Status), "Hide");
Console.WriteLine(t);
Console.WriteLine(t.GetType());
枚举类型判断、遍历
var a = (Status)1;
if (a==Status.Show)
{
Console.WriteLine("ok");
}
//判断枚举值是否在其中
short b = 1;
Console.WriteLine(Enum.IsDefined(typeof(Status), b));
Console.WriteLine(Enum.IsDefined(typeof(Status), "Show"));
//遍历枚举
foreach (var s in Enum.GetValues(typeof(Status)))
{
Console.WriteLine(s);
}
给枚举加扩展方法
方法抄这位老哥的
通过利用扩展方法, 可以给枚举加中文描述,或者用描述反推会类型,给这个老哥点赞。
using System;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
namespace ExtensionMethods
{
public enum Status
{
[Description("隐藏")]
Hide = 0,
[Description("显示")]
Show = 1
}
public static class MyExtensions
{
/// <summary>
/// 扩展方法,获得枚举的Description
/// </summary>
/// <param name="nameInstead">如果枚举值没有定义Description,是否使用枚举的名称代替
/// </param>
/// <returns>枚举的Description</returns>
public static string GetDescription(this Enum value, bool nameInstead = true)
{
Type type = value.GetType();
string name = Enum.GetName(type, value);
if (string.IsNullOrEmpty(name))
{
return null;
}
FieldInfo field = type.GetField(name);
var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
if (attribute == null && nameInstead)
{
return name;
}
return attribute?.Description;
}
/// <summary>
/// 根据Description获取枚举值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="value"></param>
/// <returns></returns>
public static T GetValueByDescription<T>(this string description) where T : struct
{
Type type = typeof(T);
foreach (var field in type.GetFields())
{
if (field.Name == description)
{
return (T)field.GetValue(null);
}
var attributes = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), true);
if (attributes != null && attributes.FirstOrDefault() != null)
{
if (attributes.First().Description == description)
{
return (T)field.GetValue(null);
}
}
}
throw new ArgumentException(string.Format("{0} 未能找到对应的枚举.", description), "Description");
}
}
}
使用
using System;
using ExtensionMethods;
namespace ConsoleApp2
{
class Program
{
/// <summary>
/// 程序主入口。
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
Console.WriteLine(Status.Hide.GetDescription());
Status s="显示".GetValueByDescription<Status>();
Console.WriteLine(s==Status.Show);
}
}
}