57
string strName = "John";
public enum Name { John,Peter }

private void DoSomething(string myname)
{
case1:
     if(myname.Equals(Name.John) //returns false
     {

     }

case2:
     if(myname == Name.John) //compilation error
     {

     }

case3:
     if(myname.Equals(Name.John.ToString()) //returns true (correct comparision)
     {

     }
}

私が使用する.Equalsときは参照比較であり、使用するとき==は値の比較を意味します。

ToString()比較のために列挙値をに変換する代わりに、より良いコードはありますか?値型enumの目的を破壊し、またToString()enumでは非推奨になるため??

4

6 に答える 6

68

このEnum.TryParse()メソッドを使用して、文字列を同等の列挙値に変換できます (存在する場合)。

Name myName;
if (Enum.TryParse(nameString, out myName))
{
    switch (myName) { case John: ... }
}
于 2012-07-16T16:53:32.680 に答える
37

文字列値を解析し、列挙比較を行うことができます。

Enum.TryParse: http://msdn.microsoft.com/en-us/library/dd783499.aspxを参照してください。

Name result;
if (Enum.TryParse(myname, out result))
{
    switch (result)
    {
        case Name.John:
            /* do 'John' logic */
            break;
        default:
            /* unexpected/unspecialized enum value, do general logic */
            break;
    }
}
else 
{
    /* invalid enum value, handle */
}

単一の値を比較するだけの場合:

Name result;
if (Enum.TryParse(myname, out result) && result == Name.John)
{
     /* do 'John' logic */
}
else 
{
    /* do non-'John' logic */
}
于 2012-07-16T16:52:57.360 に答える
8

.NET4 以降を使用している場合は、 Enum.TryParse. Enum.Parse.NET2以降で利用可能

// .NET2 and later
try
{
    switch (Enum.Parse(typeof(Names), myName))
    {
        case John: ... 
        case Peter: ...
    }
}

// .NET4 and later
Name name;
if (Enum.TryParse(myName, out name))
    switch (name)
    {
        case John: ... 
        case Peter: ...
    }
于 2012-07-16T17:00:27.137 に答える
3

1 つの解決策は、列挙型の型を取得してから型名を取得することです。

myname.Equals(Enum.GetName(typeof(Name)))

http://msdn.microsoft.com/en-us/library/system.enum.getname.aspx

于 2012-07-16T16:53:23.053 に答える
1

Enum.Parse()メソッドを探していると思います。

if(myname.Equals(Enum.Parse(Name.John)) //returns false
 {

 }
于 2012-07-16T16:53:53.267 に答える