现在的位置: 首页 > 综合 > 正文

获取枚举类型的名字字符串的方法

2012年09月19日 ⁄ 综合 ⁄ 共 1651字 ⁄ 字号 评论关闭

C++版

总之就是查表法了。

代码例子如下。

#include <stdio.h>

typedef enum {
    SUN,
    MON,
    TUE,
    WED,
    THU,
    FRI,
    SAT,
} DAY;

const char * const day[] = {
  "SUN",
  "MON",
  "TUE",
  "WED",
  "THU",
  "FRI",
  "SAT",
};

int main()
{
  DAY today = WED;
  printf("Today is %s.\n", day[today]);

  return 0;
}

C#版

.NET是比C++好用呀。代码说明一切。

public enum TimeOfDay
{
    Morning = 0,
    Afternoon = 1,
    Evening
}

public void EnumTest()
{
    TimeOfDay time = TimeOfDay.Afternoon;
    //将枚举字符串打印,即枚举类型转换(解析)成字符串类型
    Console.WriteLine(time.ToString());//输出:Afternoon

    //获取枚举字符串的值,即将一个表示枚举成员的字符串,解析为对应枚举类型
    TimeOfDay time2 = (TimeOfDay)Enum.Parse(typeof(TimeOfDay), "Evening", true);

    //枚举类型可以强制转换成整型,整型也可以强制转换成枚举型
    Console.WriteLine((int)time2);//输出:2
    // 遍历所有的枚举元素            ;
    foreach (string s in Enum.GetNames(typeof(TimeOfDay)))
    {
        Console.WriteLine(s);
    }
    //输出: Morning
    //       Afternoon
    //       Evening
}

 

关于C#枚举类型的一点补充:

枚举类型都是值类型

System.Enum是一个抽象类(abstract class),所有枚举类型都直接继承自它,当然也同时继承了它的所有成员。

所有的值类型都是System.ValueType的后代,枚举类型也不例外,枚举类型直接继承自System.Enum,而System.Enum却又直接继承自System.ValueType的,所以,枚举类型也是 System.ValueType的后代。

值类型都是System.ValueType的后代,但System.ValueType的后代不全是值类型,System.Enum就是唯一的特例!

在System.ValueType的所有后代中,除了System.Enum之外其它都是值类型。

事实上,我们可以在.NET的源代码中找到System.Enum的声明:

public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible

  • 1. 所有枚举类型(enum type)都是值类型。
  • 2. System.Enum和System.ValueType本身是引用类型。
  • 3. 枚举类型(enum type)都是隐式的直接继承自System.Enum,并且这种继承关系只能由编译器自动展开。但System.Enum本身不是枚举类型(enum type)。
  • 4. System.Enum是一个特例,它直接继承自System.ValueType,但本身却是一个引用类型

5. 枚举类型可以被装箱成System.Enum、System.ValueType、System.Object或者System.IConvertible、System.IFormattable、System.IComparable。

注意:在.NET 1.1上,枚举类型只能被装箱到System.Enum、System.ValueType、System.Object;而在.NET 2.0上,枚举类型还能被装箱到System.Enum所实现的三个接口:System.IConvertible、 System.IComparable、System.IFormattable。对应的装箱操作既可以为隐式的也可以是显式的。

抱歉!评论已关闭.