首先需要从内部了解一下枚举(Enumeration),相信许多人已经知道了,当我们声明一个这样的枚举类型:

enum MyEnum

{

AAA, BBB, CCC

}

背后的IL是这样的:

.class private auto ansi sealed MyEnum

extends [mscorlib]System.Enum

{

.field public static literal valuetype Mgen.MyEnum AAA = int32(0)

.field public static literal valuetype Mgen.MyEnum BBB = int32(1)

.field public static literal valuetype Mgen.MyEnum CCC = int32(2)

.field public specialname rtspecialname int32 value__

}

那没,其实枚举中的常量都是静态的字段。而枚举对象的值会保存在非静态的特殊字段value__中。

因此,用反射来获取名称其实就是获取类型的所有静态字段就可以了,如下代码:

var fields = typeof(MyEnum).GetFields(BindingFlags.Static | BindingFlags.Public);

foreach (var fi in fields)

Console.WriteLine(fi.Name);

输出:

AAA

BBB

CCC

对于值得获取也很简单,通过反射得到的代表静态字段的FieldInfo来获取值就可以,并且获取的值仍属于枚举类型的。如果想获取枚举背后的类型,仍需要Enum.GetUnderlyingType方法,如下代码:

var fields = typeof(MyEnum).GetFields(BindingFlags.Static | BindingFlags.Public);

foreach (var fi in fields)

{

var value = fi.GetValue(null);

Console.WriteLine("值:{0} 类型:{1} 枚举背后类型:{2}",

value, value.GetType(), Enum.GetUnderlyingType(value.GetType()));

}

输出:

值:AAA 类型:Mgen.MyEnum 枚举背后类型:System.Int32

值:BBB 类型:Mgen.MyEnum 枚举背后类型:System.Int32

值:CCC 类型:Mgen.MyEnum 枚举背后类型:System.Int32

最后获取特性,通过MemberInfo类型的GetCustomAttributes方法或者Attribute类型的静态方法都可以,比如在枚举值上加一个特性:

enum MyEnum

{

AAA, BBB,

[Obsolete]

CCC

}

代码:

var fields = typeof(MyEnum).GetFields(BindingFlags.Static | BindingFlags.Public);

foreach (var fi in fields)

Console.WriteLine(Attribute.GetCustomAttribute(fi, typeof(ObsoleteAttribute), false) != null);

输出:

False

False

True

.NET(C#):使用反射来获取枚举的名称、值和特性的更多相关文章

  1. .NET(C#):使用反射来获取枚举的名称、值和特性【转】

    首先需要从内部了解一下枚举(Enumeration),相信许多人已经知道了,当我们声明一个这样的枚举类型: enumMyEnum { AAA, BBB, CCC } 背后的IL是这样的: .class ...

  2. java反射之获取枚举对象

    项目中导入大量枚举对象,用来定义常量.随着带来一个问题,就是每个枚举类都需要通过key来获取对应枚举的需求. public enum ExamType { CRAFT(1, "草稿" ...

  3. 反射:获取枚举类型的Name,Value,Description

    [Obsolete("请使用新的方法XXX")] //使用Obsolete特性来告诉使用者这是一个过期的方法 private static void Test() { Type t ...

  4. 前台获取枚举的key值

    如: Enum ShowPosition { 首页 = 0,一级分类页 = 1,二级分类页 = 2 } 想获得汉字对应的数字,可用GetHashCode() html展示如下:循环枚举 @foreac ...

  5. .Net反射-两种方式获取Enum中的值

    public enum EJobType { 客服 = , 业务员 = , 财务 = , 经理 = } Type jobType = typeof(EJobType); 方式1: Array enum ...

  6. C#记录日志、获取枚举值 等通用函数列表

    )             {                 ] >=  && ipvals[] <=                  && ipval ...

  7. 第三章 EnumUtil根据值获取枚举对象

    项目中使用枚举类的好处这里不再赘述,在使用枚举值时,通常需要根据值来获取枚举对象,下面介绍两种实现方案: 1.在枚举类中定义方法实现 首先给出如下性别枚举类: public enum SexEnum ...

  8. .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法

    一. DescriptionAttribute的普通使用方式 1.1 使用示例 DescriptionAttribute特性可以用到很多地方,比较常见的就是枚举,通过获取枚举上定义的描述信息在UI上显 ...

  9. C# .NET 获取枚举值的自定义属性(特性/注释/备注)信息

    一.引言 枚举为我看日常开发的可读性提供的非常好的支持,但是有时我们需要得到枚举值得描述信息或者是注释(备注)信息 比如要获得 TestEmun.aaa 属性值得备注 AAA,比较不方便得到. pub ...

随机推荐

  1. Spring+shiro配置JSP权限标签+角色标签+缓存

    Spring+shiro,让shiro管理所有权限,特别是实现jsp页面中的权限点标签,每次打开页面需要读取数据库看权限,这样的方式对数据库压力太大,使用缓存就能极大减少数据库访问量. 下面记录下sh ...

  2. Give $20/month and provide 480 hours of free education

    Hi , Hope all is well. Summer is right around the corner, and the Khan Academy team is excited to sp ...

  3. 利用ROW_NUMBER中的partition by 删除重复Key的数据

    With temp As ( Select ROW_NUMBER() over(partition by LogisticsPlan order by createon) rowID,ID from ...

  4. Android 属性动画实现一个简单的PopupWindow

    1.今天看到一个PopupWindow的效果如图: 2.其实就是属性动画的一个简单实用就ObjectAnimator就可以的,想实现更多,更灵活的可以用ValueAnimator 3.直接上代码: p ...

  5. GBK还是UTF-8? Eclipse连接TFS的编码之痛!encoding, encoding, encoding…

    在中文Windows操作系统上安装Eclipse或MyEclipse,默认会将Eclipse的编码设置为GBK,与操作系统的默认编码保存一致. 在这种默认设置下,在Eclipse新增的文件不会自动被团 ...

  6. [Erlang35]Erlang18的time

    在Erlang 18中, 我们还是可以使用erlang:now/0 但也已经 deprecated啦,大量使用可能引发瓶颈. The default time warp mode has the sa ...

  7. Enabling Remote Errors in SSRS

    January 18, 2011 By default the remote errors property in SQL Server Reporting Services is set to fa ...

  8. Linux Kill 无法关闭进程

    Kill -signal Process# signal 表示kill命令给进程发送的信号 Kill命令实际上执行的动作,是给进程发送信号,常用: INT 2 这个就是你在bash下面用Ctrl+C ...

  9. [bzoj4444] 国旗计划 双指针+倍增

    Description A国正在开展一项伟大的计划--国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的边 ...

  10. 自定义JSON返回字段

    今天看到一篇文章,里面介绍了如何自定义返回json字段,感觉挺好用的,这里学习一下. 实现工具类: /** * @author fengzp * @date 17/2/20上午10:34 * @ema ...