使用反射来获取枚举的名称、值和特性
2015-05-27 14:37
309 查看
enum MyEnum { AAA, BBB, CCC }
.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__ }
其实枚举中的常量都是静态的字段。而枚举对象的值会保存在非静态的特殊字段[code]value__中。
[/code]
因此,用反射来获取名称其实就是获取类型的所有静态字段就可以了,如下代码:
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#):使用反射来获取枚举的名称、值和特性
- 使用特性和反射输出枚举类型各项列表,并可以自定义显示文字
- 01-java基础加强,eclipse工具使用,快捷键,断点调试,单元测试,jdk5新特性,增强for循环,集合map,list,可变参数,枚举,反射,泛型
- 使用反射特性获取类的访问权限
- 使用反射获取枚举的自定义属性Attribute
- 反射获取枚举特性的小例子
- 使用反射获取枚举的自定义属性Attribute及其他使用方式
- C++ 把枚举变量的名称,直接当字符串使用方法 字符串化符号 #
- jquery之操作元素属性和特性(获取特性值,attr(name)方法的使用)
- 使用PropertyInfo类反射获取类 的类型
- 后台代码中获取一个控件使用的样式的名称
- 使用反射访问特性
- 使用反射访问特性
- WindowsAPI使用详解——GetComputerName|GetUserName 获取电脑名称和当前用户名
- Android Map Api 使用和开发(3)浮动搜索框 ,通过地址名称获取经纬度和详细地址并定位
- Android Map Api 使用和开发(3)浮动搜索框 ,通过地址名称获取经纬度和详细地址并定位
- Android Map Api 使用和开发(3)浮动搜索框 ,通过地址名称获取经纬度和详细地址并定位
- Android Map Api 使用和开发(3)浮动搜索框 ,通过地址名称获取经纬度和详细地址并定位
- C# 使用反射实现根据名称动态创建窗体的几种方法