Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C#中的字符串中获取枚举值?_C#_Enums - Fatal编程技术网

如何从C#中的字符串中获取枚举值?

如何从C#中的字符串中获取枚举值?,c#,enums,C#,Enums,我有一个枚举: public enum baseKey : uint { HKEY_CLASSES_ROOT = 0x80000000, HKEY_CURRENT_USER = 0x80000001, HKEY_LOCAL_MACHINE = 0x80000002, HKEY_USERS = 0x80000003, HKEY_CURRENT_CONFIG = 0x80000005 } 给定字符串HKEY\U LOCAL\U MACHINE,如何基于枚

我有一个枚举:

public enum baseKey : uint
{  
    HKEY_CLASSES_ROOT = 0x80000000,
    HKEY_CURRENT_USER = 0x80000001,
    HKEY_LOCAL_MACHINE = 0x80000002,
    HKEY_USERS = 0x80000003,
    HKEY_CURRENT_CONFIG = 0x80000005
}
给定字符串
HKEY\U LOCAL\U MACHINE
,如何基于枚举获取值
0x8000002

baseKey choice;
if (Enum.TryParse("HKEY_LOCAL_MACHINE", out choice)) {
     uint value = (uint)choice;

     // `value` is what you're looking for

} else { /* error: the string was not an enum member */ }
在.NET 4.5之前,您必须执行以下操作,这更容易出错,并在传递无效字符串时引发异常:

(uint)Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE")

通过一些错误处理

uint key = 0;
string s = "HKEY_LOCAL_MACHINE";
try
{
   key = (uint)Enum.Parse(typeof(baseKey), s);
}
catch(ArgumentException)
{
   //unknown string or s is null
}

使用Enum.TryParse,您不需要异常处理:

baseKey e;

if ( Enum.TryParse(s, out e) )
{
 ...
}

替代解决方案可以是:

baseKey hKeyLocalMachine = baseKey.HKEY_LOCAL_MACHINE;
uint value = (uint)hKeyLocalMachine;
或者只是:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;
此代码段演示如何从字符串中获取枚举值。要从字符串转换,需要使用静态
Enum.Parse()
方法,该方法包含3个参数。首先是您想考虑的枚举类型。语法是关键字
typeof()
,后跟括号中的枚举类名称。第二个参数是要转换的字符串,第三个参数是
bool
,指示在进行转换时是否应忽略大小写

最后,请注意
Enum.Parse()
实际上返回一个对象引用,这意味着您需要显式地将其转换为所需的枚举类型(
string
int
等)


谢谢。

我总是想知道为什么Enum.Parse仍然没有通用重载。早就应该这样做了。现在有了通用的Enum.TryParse()方法。该方法如何将字符串转换为Enum值?Enum由两个组件组成:name和value。假设名称为“HKEY_LOCAL_MACHINE”,值为“0x8000002”。在这种情况下,Parse()方法是无用的,因为您可以将枚举成员强制转换为uint并获得值-2147483650。当然,Enum.Parse()会给出相同的结果,但是您可以直接强制转换正在使用的枚举变量,而不是将字符串硬编码为参数。您没有将字符串
“HKEY_LOCAL_MACHINE”
转换为值,正如OP所要求的,您将符号
HKEY_LOCAL_MACHINE
转换为值。完全不同的动物。
uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;
var value = (uint)Enum.Parse(typeof(basekey), "HKEY_LOCAL_MACHINE", true);