C#で文字列から列挙値を取得するにはどうすればよいですか?


102

私は列挙型を持っています:

public enum baseKey : uint
{  
    HKEY_CLASSES_ROOT = 0x80000000,
    HKEY_CURRENT_USER = 0x80000001,
    HKEY_LOCAL_MACHINE = 0x80000002,
    HKEY_USERS = 0x80000003,
    HKEY_CURRENT_CONFIG = 0x80000005
}

文字列を指定して、列挙型に基づいてHKEY_LOCAL_MACHINE0x80000002を取得するにはどうすればよいですか?

回答:


173
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")

1
なぜEnum.Parseへの一般的なオーバーロードがまだないのかといつも思っています。長い間遅れています。
Falanwe 2015

3
現在、汎用のEnum.TryParse <TEnum>()メソッドがあります。
ユージーンマクシモフ2015年

27

Enum.TryParseを使用すると、例外処理は必要ありません。

baseKey e;

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


16

いくつかのエラー処理で...

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

1
var value = (uint)Enum.Parse(typeof(basekey), "HKEY_LOCAL_MACHINE", true);

このコードスニペットは、文字列から列挙値を取得する方法を示しています。文字列から変換するには、Enum.Parse()3つのパラメーターを取る静的メソッドを使用する必要があります。1つ目は、検討する列挙型です。構文は、typeof()角かっこで囲まれた列挙型クラスの名前が続くキーワードです。2番目のパラメーターは変換される文字列で、3番目のパラメーターはbool変換を行うときに大文字と小文字を無視するかどうかを示します。

最後に、Enum.Parse()実際にはオブジェクト参照を返すことに注意してください。つまり、これを明示的に必要な列挙型に変換する必要がありますtype(stringintなど)。

ありがとうございました。


-2

代替ソリューションは次のとおりです。

baseKey hKeyLocalMachine = baseKey.HKEY_LOCAL_MACHINE;
uint value = (uint)hKeyLocalMachine;

あるいは単に:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;

3
文字列を列挙値にどのくらい正確に変換しますか?
Falanwe 2015

列挙型は、名前と値の2つのコンポーネントで構成されます。名前が「HKEY_LOCAL_MACHINE」で、値が「0x80000002」であるとします。enumメンバーをuintにキャストして値-2147483650を取得できるため、この場合Enum.Parse()メソッドは役に立ちません。もちろんEnum.Parse()も同じ結果になりますが、キャストできるパラメーターとして文字列をハードコーディングする代わりに直接使用している列挙型変数。
ジョージFindulov 2015

4
文字列"HKEY_LOCAL_MACHINE"を値に変換しませんでした。OPが尋ねたように、シンボルHKEY_LOCAL_MACHINEを値に変換しました。大きく異なる獣。
Falanwe 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.