//////////////////////////////////////
//
// C#中整型到枚举类型的转换
// [email protected] 郭胜涛
//
//////////////////////////////////////
C#语言中提供了枚举和整型之间的强制转换功能,但这仅限于没有给枚举类型中各个元素指定基础类型值的
情况, 如下:
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
其中Sat的值是0, Sun是1,以此类推, 这时如果要将整型值转换为枚举类型,可以直接作显式强类型转换即可,
int i_day = 1;
Days day = (Days) i_day; // day == Days.Sun
而当枚举类型中元素指定了基础类型值时,就不能用上述方法作转换了,如下:
enum Keys {
NumPad0 = 96,
NumPad1 = 97,
NumPad2 = 98,
NumPad3 = 99,
NumPad4 = 100,
NumPad5 = 101,
NumPad6 = 102
}
枚举类型 Keys中定义了小键盘按键的定义,各元素基础类型是该键的ASCII码。如果用显式强类型转换某个值时,
会抛异常,事实上强类型转换不能识别枚举元素实际的基础值,转换时类似于通过数组下标查找枚举中元素的.
那怎样才能正确的作整形到枚举类型之间的转换呢? 还好.Net 中提供了一个Enum结构. (参照.Net SDK获取它的资料)
Enum结构提供比较此类的实例的方法、将实例的值转换为其字符串表示形式的方法、将数字的字符串表示形式转换为
此类的实例的方法和创建指定枚举和值的实例的方法。
我们利用以下几个成员方法来实现转换操作:
///检索指定枚举中常数名称的数组。enumType枚举类型。 返回值 enumType 的常数名称的字符串数组。
public static string[] GetNames (
Type enumType
)
//根据指定格式将指定枚举类型的指定值转换为其等效的字符串表示形式。
//enumType 要转换的值的枚举类型。 value 要转换的值。 format 要使用的输出格式。 返回值 value 的字符串表示形式。
public static string Format (
Type enumType,
Object value,
string format
)
//将一个或多个枚举常数的名称或数字值的字符串表示转换成等效的枚举对象。
//enumType枚举的 Type。 value包含要转换的值或名称的字符串。 返回值enumType 类型的对象,其值由 value 表示。
public static Object Parse (
Type enumType,
string value
)
下面代码来实现整型到枚举类型正确的转换方法:
enum Keys {
NumPad0 = 96,
NumPad1 = 97,
NumPad2 = 98,
NumPad3 = 99,
NumPad4 = 100,
NumPad5 = 101,
NumPad6 = 102
};
IDictionary
keyCodeCharMap = new Dictionary
Type keysType = typeof(Keys); //获得Type对象
foreach (string s in Enum.GetNames(keysType)) //将枚举的元素转成字符串
{
int keyCode = Int32.Parse(Enum.Format(keysType, Enum.Parse(keysType, s), "d")); //获取元素基础值
Keys key = Enum.Parse(keysType, s); //获取元素值
if (!keyCodeCharMap.Keys.Contains(keyCode))
{
keyCodeCharMap.Add(keyCode, key); //写入到字典中
}
}
//测试
int num = 99;
Keys simpleKey = keyCodeCharMap[num]; //通过整型值 99 得到对应的枚举值。 NumPad3