[.Net] 通过反射,给Enum加备注
今天和大家分享一个给Enum加备注的技巧,话不多说,先上一段代码:
namespace TestReflector.Model.Entities
{
public class UserInfo
{
public int Id { get; set; } public string Name { get; set; } public UserStatusEnum UserStatus { get; set; }
} public enum UserStatusEnum
{
/// <summary>
/// 待审核
/// </summary>
WaitAudit, /// <summary>
/// 审核中
/// </summary>
Auditing, /// <summary>
/// 已审核
/// </summary>
Audited
}
}
相信大家在项目中都遇到过这种情况吧,用户的状态只是一个枚举,但UI层确需要显示对应的提示信息(例如“待审核”)。
怎样将Enum转换为字符串,写个转换方法?No!!!
下面介绍一种插入元数据的方式来实现此功能,使代码易维护,又不会分散在各个地方:
1. 首先建立一个工具类:
/// <summary>
/// 枚举类型扩展方法类
/// </summary>
public static class EnumExtention
{
/// <summary>
/// 获取枚举值的详细文本[Description]
/// </summary>
/// <param name="target"></param>
/// <returns></returns>
public static string GetDescription(this System.Enum target)
{
Type t = target.GetType();
//获取字段信息
System.Reflection.FieldInfo[] fieldInfos = t.GetFields();
foreach (System.Reflection.FieldInfo info in fieldInfos)
{
//判断名称是否相等
if (info.Name != target.ToString()) continue; #region 4.5
////反射出自定义属性
//var dscript = info.GetCustomAttribute<DescriptionAttribute>(true);
////类型转换找到一个Description,用Description作为成员名称
//if (dscript != null)
// return dscript.Description;
#endregion #region 3.5
//反射出自定义属性
foreach (Attribute attr in info.GetCustomAttributes(true))
{
//类型转换找到一个Description,用Description作为成员名称
var dscript = attr as DescriptionAttribute;
if (dscript != null)
return dscript.Description;
}
#endregion
} //如果没有检测到合适的注释,则用默认名称
return target.ToString();
} }
2.第二步,我们来修改原来的UserStatusEnum:
public enum UserStatusEnum
{
/// <summary>
/// 待审核
/// </summary>
[Description("待审核")]
WaitAudit, /// <summary>
/// 审核中
/// </summary>
[Description("审核中")]
Auditing, /// <summary>
/// 已审核
/// </summary>
[Description("已审核")]
Audited
}
不要忘记导入命名空间:
using System.ComponentModel;
3. OK,准备工作已经做好了,使用方法如下:
class Program
{
private static void Main(string[] args)
{
var userStatus = UserStatusEnum.Auditing; string strUserStatus = userStatus.GetDescription(); Console.WriteLine(strUserStatus); Console.ReadKey();
}
}
4. 输出结果:

5. 到了现在已经可以告一段落了,我们的小工具已经实现了需要的功能。但反射的效率如何呢?
我可以告诉大家的是:效率不堪入目。。。
6. 优化效率:
反射的耗时操作在于搜索元数据,我们可以将搜索出的MethodInfo、FieldInfo缓存一下,以达到提升效率的目的。
下面是我优化过后的结果:





7.可以看出。优化过后的代码执行效率提升了10倍左右。好了,今天的文章分享到这里,希望可以给大家带来方便。
/// <summary>
/// 枚举类型扩展方法类
/// </summary>
public static class EnumExtention
{
private static readonly Dictionary<RuntimeTypeHandle, FieldInfo[]> CacheFieldInfo = new Dictionary<RuntimeTypeHandle, FieldInfo[]>();
private static readonly Dictionary<string, DescriptionAttribute> CacheDescriptionAttr = new Dictionary<string, DescriptionAttribute>(); /// <summary>
/// 获取枚举值的详细文本[Description]
/// </summary>
/// <param name="target"></param>
/// <returns></returns>
public static string GetDescription(this System.Enum target)
{
Type t = target.GetType();
var typeHandle = t.TypeHandle;
string strTarget = Enum.GetName(t, target); //获取字段信息
System.Reflection.FieldInfo[] arrFieldInfo;
if (CacheFieldInfo.ContainsKey(typeHandle))
{
arrFieldInfo = CacheFieldInfo[typeHandle];
}
else
{
arrFieldInfo = t.GetFields();
CacheFieldInfo[typeHandle] = arrFieldInfo;
} for (int i = arrFieldInfo.Length - ; i >= ; i--)
{
var fieldInfo = arrFieldInfo[i]; //判断名称是否相等
if (fieldInfo.Name != strTarget) continue; #region 3.5 //反射出自定义属性
if (CacheDescriptionAttr.ContainsKey(strTarget))
{
var dscript = CacheDescriptionAttr[strTarget];
return dscript.Description;
}
else
{
var arrAttr = fieldInfo.GetCustomAttributes(true);
for (int j = arrAttr.Length - ; j >= ; j--)
{
var attr = arrAttr[j];
//类型转换找到一个Description,用Description作为成员名称
var dscript = attr as DescriptionAttribute;
if (dscript != null)
{
CacheDescriptionAttr[strTarget] = dscript;
return dscript.Description;
}
}
} #endregion 3.5
} //如果没有检测到合适的注释,则用默认名称
return strTarget;
}
}
[.Net] 通过反射,给Enum加备注的更多相关文章
- 反射 类的加载 Schema DOM 解析方式和解析器 命名空间
Day15 反射 1.1 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. l 加载 就是指将class文件读入内存,并为之创建 ...
- Java反射、动态加载(将java类名、方法、方法参数当做参数传递,执行方法)
需求:将java类名.方法.方法参数当做参数传递,执行方法.可以用java的动态加载实现 反射的过程如下: 第一步:通过反射找到类并创建实例(classname为要实例化的类名,由pack ...
- JAVA反射机制--静态加载与动态加载
Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如pu ...
- C# 反射实现动态加载程序集
原文:https://blog.csdn.net/pengdayong77/article/details/47622235 在.Net 中,程序集(Assembly)中保存了元数据(MetaData ...
- 反射和动态加载bean 完成 通用servie
最近我们部门有个小项目,用来管理这个公司所有项目用到的代码表,例如国家代码.行政区划代码等.这个项目的功能其实很少,就是简单的修改.查询.新增和逻辑删除.但是为每张表都写一套增删改查的页面和一套ser ...
- C#实现反射调用动态加载的DLL文件中的方法
反射的作用:1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型 2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射.3. ...
- windows的磁盘操作之七——获取当前所有的物理磁盘号 加备注
windows的磁盘操作之七--获取当前所有的物理磁盘号 2011-07-28 17:47:56 标签:windows API DeviceIoControl 物理磁盘 驱动器号 原创作品,允许转载 ...
- 仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢?
原文:仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢? 平时我们获取一个程序集或者类型的 Attribute 是非常轻松 ...
- JavaEE基础(二十七)/反射、JDK新特性
1.反射(类的加载概述和加载时机) A:类的加载概述 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载 就是指将class文件读入 ...
随机推荐
- lambda表达式和查询表达式
(1)Lambda表达式定义: Lambda是创建匿名函数的另一种形式.它比对应的匿名方法更加的简化.因此,所有的情况都推荐使用Lambda表达式. 它可以包括表达式和语句,并且用于创建委托和事件 ...
- log4j相对路径找不到,处理方法
http://blog.csdn.net/u012345283/article/details/40821833?utm_source=tuicool&utm_medium=referral
- iOS中的上传、下载流程心得
访问相册 1. 判断资源库是否有效 2. 创建imagePickerController 设置代理 弹出视图控制器 3. 实现协议方法 > iOS10 访问系统相册需要在info.plis ...
- Hibernate一对多(注解)
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...
- Python模块:collections
collections模块常用的数据类型: (1)namedtuple(): #创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素. fr ...
- mysql学习(1)-linux操作系统源码包安装
背景: CentOS 6.4下通过yum安装的MySQL是5.1版的,比较老,所以就想通过源代码安装高版本的5.6.22. 正文: 一:卸载旧版本 使用下面的命令检查是否安装有MySQL Server ...
- js常用方法
若未声明,则都是js的方法 1.indexOf indexOf(str):默认返回字符串中第一次出现索引位置 的下标,没有则返回-1 indexOf(str,position):返回从position ...
- js将json字符串转化成json对象的方法
js将json字符串转化成json对象的方法: JSON.parse(jsonObject)
- Abp项目中的领域模型实体类访问仓储的方法
首先声明,不推荐使用这种方法.实体访问仓储是不被推荐的! 1.简单粗暴的方法 Abp.Dependency.IocManager.Instance.Resolve>(); 2.绕个弯子的方法 首 ...
- Excel2016右键新建工作表,打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决办法
上午新建excel工作表时,发现新建完之后居然打不开 提示: 尼玛这坑爹的,难道我的Excel坏了?? 排查问题之后发现 只有新建“Microsoft Excel 工作表”时会出现这种问题,新建“Wo ...