C#开发WinForm之枚举
前言
几乎高级语言都有枚举,枚举值是int,值从0开始,如果我们想给枚举赋个字符串呢,用枚举值表示字符串怎么做到?
基本情况
常见枚举
enum Colors { Red, Green, Blue, Yellow };
可以取到如下值
Enum转字符串
string valueStr = Colors.Red.ToString();//值为Red
Enum转int
int value = (int)Colors.Red;
字符串转Enum
(Colors)Enum.Parse(typeof(Colors), "Red")
int转Enum
-
可以强制转换将整型转换成枚举类型。
例如:Colors color = (Colors)2 ,那么color即为Colors.Blue
-
利用Enum的静态方法ToObject。
public static Object ToObject(Type enumType,int value)
例如:Colors color = (Colors)Enum.ToObject(typeof(Colors), 2),那么color即为Colors.Blue
判断某个整型是否定义在枚举中
public static bool IsDefined(Type enumType,Object value)
例如:Enum.IsDefined(typeof(Colors), n))
自定义返回字符串
如果我想通过Red枚举获得红色值怎么办
新建RemarkAttribute.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DongliCAD.dyEnum
{
public class RemarkAttribute : Attribute
{
public RemarkAttribute(string remark)
{
this.Remark = remark;
}
/// <summary>
/// 备注
/// </summary>
public string Remark { get; set; }
}
}
新建EnumExtension.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace DongliCAD.dyEnum
{
/// <summary>
/// 枚举扩展类
/// string style = EnumExtension.GetRemark(MongoLogicOp.style);取备注
///int style = (int)MongoLogicOp.style;取int值
///string style = MongoLogicOp.style.ToString();//取字符串,返回的字符串和属性名一样
///
///
/// </summary>
public static class EnumExtension
{
/// <summary>
/// 获取枚举的备注信息
/// </summary>
/// <param name="em"></param>
/// <returns></returns>
public static string GetRemark(this Enum em)
{
Type type = em.GetType();
FieldInfo fd = type.GetField(em.ToString());
if (fd == null)
return string.Empty;
object[] attrs = fd.GetCustomAttributes(typeof(RemarkAttribute), false);
string name = string.Empty;
foreach (RemarkAttribute attr in attrs)
{
name = attr.Remark;
}
return name;
}
/// <summary>
/// 获取备注信息对应的枚举值
/// </summary>
/// <param name="remark"></param>
/// <returns></returns>
public static string ByRemark<T>(this string remark)
{
Type type = typeof(T);
FieldInfo[] fds = type.GetFields();
foreach (var fd in fds)
{
object[] attrs = fd.GetCustomAttributes(typeof(RemarkAttribute), false);
foreach (RemarkAttribute attr in attrs)
{
var name = attr.Remark;
if (name == remark)
return fd.Name;
}
}
return null;
}
}
}
枚举定义如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DongliCAD.dyEnum
{
enum Colors
{
[Remark("红色")]
Red,
[Remark("绿色")]
Green,
[Remark("蓝色")]
Blue,
[Remark("黄色")]
Yellow
}
}
其中[Remark(“红色”)]是在RemarkAttribute.cs里定义的。
取红色:EnumExtension.GetRemark(Colors.Red);
取黄色:EnumExtension.GetRemark(Colors.Yellow);
扩展
枚举Colors遍历
private static void Main(string[] args)
{
foreach (Colors color in Enum.GetValues(typeof(Colors)))
{
int value = (int)color;//0,1,2,3
int valueName = color.ToString();//Red,Green,Blue,Yellow
int remakr = EnumExtension.GetRemark(color);//红色,绿色,黄色,黄色
}
}