Получить enum из атрибута enum

Случай 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

33
задан nawfal 10 June 2013 в 07:12
поделиться

3 ответа

Вот вспомогательный метод, который должен указать вам правильное направление.

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 , как вы это делаете в своем вопросе.

21
ответ дан 27 November 2019 в 18:37
поделиться

Я использую 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;
}
11
ответ дан 27 November 2019 в 18:37
поделиться

Не уверен, что я что-то здесь упускаю, не могли бы вы сделать это,

Als temp = (Als)combo1.SelectedItem;
int t = (int)temp;
1
ответ дан 27 November 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: