怎么获取enum的变量名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么获取enum的变量名称相关的知识,希望对你有一定的参考价值。

假设一个枚举类型

typedef enum NUMBERLIST


int ZERO = 0;

int ONE = 1;

int TWO = 2;

NUMBER;

NUMBER num;

现在我要如何用简单的方法根据num的值获得“ZERO”,“ONE”之类的字符串变量?用switch或者if不可行,实际的变量数非常多
忘记说了,是用C的方法实现,编译器是gcc,楼下那些C#或者C++的方法没法用

将枚举的值转换为对应的名字
inthashCode = Color.Red.GetHashCode(); stringenumParseStr = Enum.Parse(typeof(Color), hashCode.ToString()).ToString();Enum.Parse()得到的值是object类型的,我们要转换的是值,得到的是名字,因此ToString()得到名字。

将枚举的名字转换为对应的值
stringstr = Color.Red.ToString(); intenumParseInt = Convert.ToInt32(Enum.Parse(typeof(Color), str));这里要转换的是名字,得到的是值,因此用Convert.ToInt32()得到该值。
参考技术A c语言里的枚举实际上是结构体,枚举项是变量名,没法直接获得的……你可以再自己定义一个字符串数组:
char numberString[30][MAX_LENGTH]="ZERO","ONE","TWO"
在需要用到原来枚举的地方这样调用
numberString[num.ZERO]追问

如果没办法那就算了,有8000多个枚举项,有用的也有好几百,这样会累死。。。谢谢

追答

或者你可以借助其他语言编程,根据原来的枚举,生成字符串数组,把原来枚举的代码复制到一个txt文件里,一行一行读取,分析,生成对应的数组。

本回答被提问者采纳
参考技术B tostring方法。
----------------
回答你的补充提问:
我觉得那样为什么要定义成枚举?定义成数组也许好些吧?或者定义哈希表之类的对应起来,
两者可以互相查。追问

这个是历史原因,改不了。。。请问就没有用C的方法了么

参考技术C 可以这样做:
NUMBERLIST s = (NUMBERLIST)Enum.Parse(typeof(NUMBERLIST), 1);

枚举ENUM的tostring() valueof()和values()用法

从jdk5出现了枚举类后,定义一些字典值可以使用枚举类型;

枚举常用的方法是values():对枚举中的常量值进行遍历;

valueof(String name) :根据名称获取枚举类中定义的常量值;要求字符串跟枚举的常量名必须一致;

枚举类中重写了toString()方法,返回的是枚举常量的名称;

其实toString()和value是相反的一对操作。valueOf是通过名称获取枚举常量对象。而toString()是通过枚举常量获取枚举常量的名称;

 1 package enumTest;
 2 
 3 /**
 4  * author:THINK
 5  * version: 2018/7/16.
 6  */
 7 public enum Color {
 8 
 9     RED(0,"红色"),
10     BLUE(1,"蓝色"),
11     GREEN(2,"绿色"),
12 
13     ;
14 
15 //    可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。
16     private int code;
17     private String desc;
18 
19     Color(int code, String desc) {
20         this.code = code;
21         this.desc = desc;
22     }
23 
24     /**
25      * 自己定义一个静态方法,通过code返回枚举常量对象
26      * @param code
27      * @return
28      */
29     public static Color getValue(int code){
30 
31         for (Color  color: values()) {
32             if(color.getCode() == code){
33                 return  color;
34             }
35         }
36         return null;
37 
38     }
39 
40 
41     public int getCode() {
42         return code;
43     }
44 
45     public void setCode(int code) {
46         this.code = code;
47     }
48 
49     public String getDesc() {
50         return desc;
51     }
52 
53     public void setDesc(String desc) {
54         this.desc = desc;
55     }
56 }

测试类

 1 package enumTest;
 2 
 3 /**
 4  * author:THINK
 5  * version: 2018/7/16.
 6  */
 7 public class EnumTest {
 8     public static void main(String[] args){
 9         /**
10          * 测试枚举的values()
11          *
12          */
13         String s = Color.getValue(0).getDesc();
14         System.out.println("获取的值为:"+ s);
15 
16 
17 
18         /**
19          * 测试枚举的valueof,里面的值可以是自己定义的枚举常量的名称
20          * 其中valueOf方法会把一个String类型的名称转变成枚举项,也就是在枚举项中查找字面值和该参数相等的枚举项。
21          */
22 
23         Color color =Color.valueOf("GREEN");
24         System.out.println(color.getDesc());
25 
26         /**
27          * 测试枚举的toString()方法
28          */
29 
30         Color s2 = Color.getValue(0) ;
31         System.out.println("获取的值为:"+ s2.toString());
32 
33     }

 

以上是关于怎么获取enum的变量名称的主要内容,如果未能解决你的问题,请参考以下文章

c的printf怎么输出枚举类型变量

Enum介绍

第二天C#学习

c#中的静态变量,怎么通过反射的方式获取指定变量名称的值呢?比如说一个const类型的常量:con

gdb - 获取寄存器的变量名

您可以从类中获取实例变量名称吗? [复制]