Случай 1
>>> x = "123"
>>> y = "123"
>>> x == y
True
>>> x is y
True
>>> id(x)
50986112
>>> id(y)
50986112
Случай 2
>>> x = "12"
>>> y = "123"
>>> x = x + "3"
>>> x is y
False
>>> x == y
True
Теперь, ваш вопрос заключается в том, почему идентификатор один и тот же в случае 1, а не в случае 2. В случае 1, вы назначили строковый литерал "123"
на x
и y
.
Так как строка неизменяема, интерпретатор имеет смысл хранить строковый литерал только один раз и указывать все переменные на один и тот же объект. Следовательно, вы видите идентификатор как идентичный.
В случае 2 вы изменяете x
с помощью конкатенации. И x
, и y
имеют одинаковые значения, но не идентичны. Оба указывают на разные объекты в памяти. Следовательно, они имеют разные id
и is
оператор, возвращенные False
Вот вспомогательный метод, который должен указать вам правильное направление.
protected Als GetEnumByStringValueAttribute(string value)
{
Type enumType = typeof(Als);
foreach (Enum val in Enum.GetValues(enumType))
{
FieldInfo fi = enumType.GetField(val.ToString());
StringValueAttribute[] attributes = (StringValueAttribute[])fi.GetCustomAttributes(
typeof(StringValueAttribute), false);
StringValueAttribute attr = attributes[0];
if (attr.Value == value)
{
return (Als)val;
}
}
throw new ArgumentException("The value '" + value + "' is not supported.");
}
И чтобы вызвать это, просто сделайте следующее:
Als result = this.GetEnumByStringValueAttribute<Als>(ComboBox.SelectedValue);
Это, вероятно, не лучшее решение, хотя оно связано с Als
, и вы, вероятно, захотите сделать этот код повторно используемым. Вы, вероятно, захотите вырезать код из моего решения, чтобы вернуть вам значение атрибута, а затем просто используйте Enum.Parse
, как вы это делаете в своем вопросе.
Я использую DescriptionAttribute от Microsoft и следующий метод расширения:
public static string GetDescription(this Enum value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
string description = value.ToString();
FieldInfo fieldInfo = value.GetType().GetField(description);
DescriptionAttribute[] attributes =
(DescriptionAttribute[])
fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0)
{
description = attributes[0].Description;
}
return description;
}
Не уверен, что я что-то здесь упускаю, не могли бы вы сделать это,
Als temp = (Als)combo1.SelectedItem;
int t = (int)temp;