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

enumMyEnum

{

AAA, BBB, CCC

}

背后的IL是这样的:

.classprivate auto ansi sealed MyEnum

extends [mscorlib]System.Enum

{

)

)

)

.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类型的静态方法都可以,比如在枚举值上加一个特性:

enumMyEnum

{

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

作者:Mgen
出处:www.cnblogs.com/mgen
其他参考页面:我的软件和工程博客导读

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

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

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

  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. C语言的本质(13)——指向指针的指针

    指针可以指向基本类型,也可以指向复合类型,因此一个指针变量存放的可以是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量.由于指针变量直接指向变量,所以称为"单级间址".而 ...

  2. SQL SERVER分区视图

    借助SQL SERVER分区视图,可以对SQL中的表进行集中管理,下文将以实例的方式为您详解SQL SERVER分区视图,希望对您学习SQL数据库能有所帮助. SQL SERVER分区视图给我们提供了 ...

  3. oracle resetlog与noresetlog的作用(转载)

    关于resetlog的作用是将日志序列重置,这样以前的归档就作废. 首先一定要明白oracle工作的基本原理,归档情况下:大家一定要同步,谁也不能滞后或者超前,也就是SCN号,如果学oracle不懂s ...

  4. NLS_COMP和NLS_SORT参数

    Oracle默认是采用binary进行排序,这对于例如中文的排序来说,是不恰当的.使用这两个参数可以指定排序的方法,比如拼音或是,要注意可能会引起性能问题.解决方法是使用NLSSORT函数来建立一个函 ...

  5. CalendarHelper日期计算工具,各种日期的获取和计算

    今天分享一个日期获取和计算的工具类,这个最初是用在项目中获取每周每月日期用的. <Attention> 之后逛帖子的时候发现了这个专门处理日期的库,java上也有,android上还为了避 ...

  6. windows不能在本地计算机启动SQL Server(MSSQLSERVER)

    windows不能在本地计算机启动sql server 在登录数据库的时候,发现数据库不能登录,提示[无法连接到实例],很明显这是因为数据库服务没有启动导致的,我们打开[服务]启动相应的SQL数据库服 ...

  7. MVC+simpleinjector 简单使用

    一.首先添加NuGet包如下图

  8. UIButton 文档翻译(持续更新)

    UIButton 文档翻译 继承 UIControl; UIView; UIResponder; NSObject 协议 UIFocusEnvironment,UIAppearanceContaine ...

  9. asp.net 两个页面之前传递数据

    .在两个表单之间传递数据 看下面的代码: 对于WebForm1: private void Page_Load(object sender, System.EventArgs e) { ArrayLi ...

  10. PHP和C#可共用的可逆加密算法

    PHP 加密用法 <?phpclass DES{    var $key;    var $iv; //偏移量        function DES($key = '11001100', $i ...