Ответ 1
Вы можете использовать метод Enum.TryParse()
для преобразования строки в эквивалентное перечислимое значение (если оно существует):
Name myName;
if (Enum.TryParse(nameString, out myName))
{
switch (myName) { case John: ... }
}
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
, это сравнение ссылок, и когда я использую ==
, это означает сравнение значений.
Есть ли лучший код вместо преобразования значения enum в ToString()
для сравнения? потому что он разрушает цель перечисления типа значения, а также, ToString()
в enum устарел??
Вы можете использовать метод Enum.TryParse()
для преобразования строки в эквивалентное перечислимое значение (если оно существует):
Name myName;
if (Enum.TryParse(nameString, out myName))
{
switch (myName) { case John: ... }
}
Вы можете проанализировать строковое значение и выполнить сопоставление перечислений.
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 */
}
Если вы используете .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: ...
}
Одним из решений может быть получение типа перечисления, а затем имя типа.
myname.Equals(Enum.GetName(typeof(Name)))
http://msdn.microsoft.com/en-us/library/system.enum.getname.aspx
Я думаю, что вы ищете метод Enum.Parse()
.
if(myname.Equals(Enum.Parse(Name.John)) //returns false
{
}
По какой-то причине данные решения не помогли мне. Я должен был сделать несколько иначе:
Name myName;
if (Enum.TryParse<Name>(nameString, out myName))
{
switch (myName) { case John: ... }
}
Надеюсь, это поможет кому-то:)