C# 如何在C中比较字符串和枚举#

C# 如何在C中比较字符串和枚举#,c#,.net,C#,.net,当我使用.Equals时,它是参考比较,当我使用=时,它意味着值比较 是否有更好的代码代替将枚举值转换为ToString()进行比较?因为它破坏了值类型enum的用途,而且enum上的ToString()也不推荐使用???您可以解析字符串值并进行enum比较 Enum.TryParse:请参阅 如果您只是比较单个值: Name result; if (Enum.TryParse(myname, out result)) { switch (result) { ca

当我使用
.Equals
时,它是参考比较,当我使用
=
时,它意味着值比较


是否有更好的代码代替将枚举值转换为
ToString()
进行比较?因为它破坏了值类型enum的用途,而且enum上的
ToString()
也不推荐使用???

您可以解析字符串值并进行enum比较

Enum.TryParse:请参阅

如果您只是比较单个值:

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 */
}

您可以使用该方法将字符串转换为等效的枚举值(假设存在):


我想您正在寻找
Enum.Parse()
方法

Name myName;
if (Enum.TryParse(nameString, out myName))
{
    switch (myName) { case John: ... }
}

如果您使用.NET4或更高版本,则可以使用。并可用于.NET2及更高版本

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

 }

出于某种原因,给出的解决方案对我来说并不合适。我不得不用一种完全不同的方式:

// .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: ...
    }
Name我的名字;
if(Enum.TryParse(nameString,out myName))
{
开关(myName){case John:…}
}

希望它能帮助某些人:)

为什么要将字符串与枚举值进行比较?有没有办法完全避免这种情况?尝试将枚举与字符串进行比较是个坏主意。@SecurityHound在处理其他代码库时,这通常是不可避免的。这比比较每个枚举的
ToString()
值要好得多。:)MyEnumValue.ToString()有什么不好的地方?@Heinzlmaen-ToString()可以工作,但是您会多次比较两个字符串(对于每个枚举)-nameString.Equals(JohnEnum.ToString())。你可能会有大写/小写等错误。使用Enum.TryParse可以使用switch语句,这在我看来更干净,如果必须转换为小写等。您只需要在Enum.TryParse(nameString.ToLowerInvariant(),out myName))中执行一次。这是一个错误,在您编辑答案之前,我无法重做。很抱歉
if(myname.Equals(Enum.Parse(Name.John)) //returns false
 {

 }
// .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: ...
    }
Name myName;
if (Enum.TryParse<Name>(nameString, out myName))
{
    switch (myName) { case John: ... }
}