.NET(C#):使用反射来获取枚举的名称、值和特性
首先需要从内部了解一下枚举(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#):使用反射来获取枚举的名称、值和特性的更多相关文章
- .NET(C#):使用反射来获取枚举的名称、值和特性【转】
首先需要从内部了解一下枚举(Enumeration),相信许多人已经知道了,当我们声明一个这样的枚举类型: enumMyEnum { AAA, BBB, CCC } 背后的IL是这样的: .class ...
- java反射之获取枚举对象
项目中导入大量枚举对象,用来定义常量.随着带来一个问题,就是每个枚举类都需要通过key来获取对应枚举的需求. public enum ExamType { CRAFT(1, "草稿" ...
- 反射:获取枚举类型的Name,Value,Description
[Obsolete("请使用新的方法XXX")] //使用Obsolete特性来告诉使用者这是一个过期的方法 private static void Test() { Type t ...
- 前台获取枚举的key值
如: Enum ShowPosition { 首页 = 0,一级分类页 = 1,二级分类页 = 2 } 想获得汉字对应的数字,可用GetHashCode() html展示如下:循环枚举 @foreac ...
- .Net反射-两种方式获取Enum中的值
public enum EJobType { 客服 = , 业务员 = , 财务 = , 经理 = } Type jobType = typeof(EJobType); 方式1: Array enum ...
- C#记录日志、获取枚举值 等通用函数列表
) { ] >= && ipvals[] <= && ipval ...
- 第三章 EnumUtil根据值获取枚举对象
项目中使用枚举类的好处这里不再赘述,在使用枚举值时,通常需要根据值来获取枚举对象,下面介绍两种实现方案: 1.在枚举类中定义方法实现 首先给出如下性别枚举类: public enum SexEnum ...
- .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法
一. DescriptionAttribute的普通使用方式 1.1 使用示例 DescriptionAttribute特性可以用到很多地方,比较常见的就是枚举,通过获取枚举上定义的描述信息在UI上显 ...
- C# .NET 获取枚举值的自定义属性(特性/注释/备注)信息
一.引言 枚举为我看日常开发的可读性提供的非常好的支持,但是有时我们需要得到枚举值得描述信息或者是注释(备注)信息 比如要获得 TestEmun.aaa 属性值得备注 AAA,比较不方便得到. pub ...
随机推荐
- Oracle学习笔记(八)
十一.子查询 1.子查询概述 学习子查询的原因 事例:查询工资比SCOTT高的员工信息 思路:1.scott的工资 select sal from emp where ename='SCOTT'; 2 ...
- 安装及运行 RabbitMQ 服务器 (windows)
1. 一些网址 http://www.rabbitmq.com/ http://www.rabbitmq.com/install-windows.html http://www.rabbitmq.co ...
- EBS请求查找运行详细信息
--查找运行请求时间,参数等(可以是某用户的,某个报表) select c.user_name, papf.full_name, b.user_concurrent_progr ...
- 【转】如何避免OOM总结
原文地址:http://www.csdn.net/article/2015-09-18/2825737/3 减小对象的内存占用 避免OOM的第一步就是要尽量减少新分配出来的对象占用内存的大小,尽量使用 ...
- eFrameWork学习笔记-eList
HTML: <div style="margin:8px;"> <h1>.不分页</h1> <asp:Repeater id=" ...
- 自己从0开始学习Unity的笔记 II (C#条件语句基础练习)
首先,自己用了下三目表达式,来做了一个闰年的判断,也就是能被400整除,或者是能够被4整除,但是不能被100整除的年份. int year; //输入的年 bool fourHunderd; //能被 ...
- C#基础知识入门概要(自我回顾用)
一,C#是什么? 人与人之间可以用语言进行交流,我们和计算机交流也是通过语言.我们可以通过语言让一个人做一件我们想让他做事情(他愿意的话~),我们能不能让计算机按照我们的意愿来做事情呢?比如我们让计算 ...
- poj 1006 Biorhythms (中国剩余定理模板)
http://poj.org/problem?id=1006 题目大意: 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这 ...
- php函数源代码 C编写 【持续更新】
由于经常被抓取文章内容,在此附上博客文章网址:,偶尔会更新某些出错的数据或文字,建议到我博客地址 : --> 点击这里 strlen() 获取字符串长度,成功则返回字符串 string 的长度 ...
- K - 欧拉回路(并查集)
点击打开链接 K - 欧拉回路 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试用例.每个测试用例的第 ...