使用反射来获取枚举的名称、值和特性
来源:互联网 发布:透镜设计软件 编辑:程序博客网 时间:2024/05/24 03:22
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__}
其实枚举中的常量都是静态的字段。而枚举对象的值会保存在非静态的特殊字段value__
中。
因此,用反射来获取名称其实就是获取类型的所有静态字段就可以了,如下代码:
var fields = typeof(MyEnum).GetFields(BindingFlags.Static | BindingFlags.Public);foreach (var fi in fields) Console.WriteLine(fi.Name);输出:
AAABBBCCC对于值得获取也很简单,通过反射得到的代表静态字段的
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);输出:
FalseFalseTrue
0 0
- 使用反射来获取枚举的名称、值和特性
- 获取枚举的名称
- 在C#中如何实现枚举类型的特性扩展和反射获取
- 获取Delphi中定义的枚举类型的名称和值
- C#中循环获取枚举中的名称和值
- Silverlight4.0使用反射来遍历枚举
- 使用Java5特性来简化反射编程
- 使用Java5特性来简化反射编程
- 使用Java5特性来简化反射编程
- 使用Java5特性来简化反射编程
- 使用Java5特性来简化反射编程
- 使用Java5特性来简化反射编程
- 使用反射特性获取类的访问权限
- 使用特性和反射输出枚举类型各项列表,并可以自定义显示文字
- 利用反射获取类的属性名称
- C#反射获取属性的名称
- 反射枚举的值
- Java使用反射来获取Map的泛型信息
- error MSB3073::VCEnd”已退出,代码为 4
- Hibernate级联查找
- javascript操作select 组件 opetion的增减
- vs2010 error C2001: 常量中有换行符
- Hadoop之——使用hadoop自定义类型处理手机上网日志
- 使用反射来获取枚举的名称、值和特性
- ubuntu修改IP地址和网关
- 第十二周 项目2-摩托车继承自行车和机动车
- 不用翻墙搞定android开发环境
- Javah提示未找到 ..的类文件
- 关于FragmentManager动态管理Fragment时Fragment生命周期的探究
- 未来码农或可以备份一个自己的大脑
- Maven 编译打包时如何忽略测试用例
- Oracle 树操作(select…start with…connect by…prior)