[.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文件读入 ...
随机推荐
- MySQL root密码找回
以MySQL多实例为例,演示找回MySQL root的密码 1.关闭mysql服务 [root@mysql ~]# mysqladmin -uroot -poldboy123 -S /data/330 ...
- iOS 上架被拒原因保存
一.后台一直在获取用户的定位,需要给用户电池消耗提示 Your app uses the Location Background mode but does not include the requi ...
- 第四组 12月8号sprint会议
会议时间:12月8号,16:30会议地点:蛙鸣湖旁小树林 会议进程: 1.首先对到场人员进行点名 2.对程序主要功能进行讨论,每人都可以自由发言,然后分配每个成员的任务,并决定实现第一个功能: ...
- notepad++的CoolFormat代码格式化插件使用
因为notepad++的NppAStyle插件只支持格式化C.C++.C#.Java这四种编程语言的代码,所以本人推荐使用这个CoolFormat的插件,相比于NPPAStyle,CoolFormat ...
- java中的static使用--静态变量、静态方法
Java 中的 static 使用之静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 s ...
- 解决libcurl7.50.3在windows XP SP3 VC++ 6.0下编译报错 unresolved external symbol __imp__IdnToAscii@20 unresolved external symbol __imp__IdnToUnicode@20
错误重现: --------------------Configuration: curl - Win32 LIB Debug DLL Windows SSPI DLL WinIDN--------- ...
- 【随笔】js加载
有时候,当发现js操作一个dom的时候,发现dom没有找到,这是由于html没有加载完就开始操作该dom的缘故,所以需要在html文档加载完后再加载js,于是我们可以这么做: js方法:window. ...
- 调用 WebService 浏览器提示 500 (Internal Server Error) 的原因及解决办法
在 ASP.NET 开发中,WebService部署成站点之后,如果在本地测试WebService可以运行,在远程却显示“测试窗体只能用于来自本地计算机的请求”或 者"The test fo ...
- 20151208Study
20151208-----------------------------------------------------* Her main interest now is raising her ...
- C# 将sheet中数据转为list
public IList<T> ExportToList<T>(ISheet sheet, string[] fields) where T : class,new() { I ...