Как получить enum, когда у меня только короткое отображаемое имя? - PullRequest
1 голос
/ 26 марта 2012

Я получил короткое имя Diplay и мне нужно получить значение enum, используя его?

[Display(Name = "Alabama", ShortName = "AL")]
        Alabama = 1,

Я просто получаю AL из внешней базы данных. Мне нужно как-то прочитать мое перечисление и получить правильное значение. Спасибо за любую помощь, ребята.

Ответы [ 4 ]

1 голос
/ 09 октября 2017

@ jasel Я немного изменил твой код.это подходит просто отлично, что мне нужно.

    public static T GetValueByShortName<T>(this string shortName)
    {
        var values = from f in typeof(T).GetFields(BindingFlags.Static | BindingFlags.Public)
                     let attribute = Attribute.GetCustomAttribute(f, typeof(DisplayAttribute)) as DisplayAttribute
                     where attribute != null && attribute.ShortName == shortName
                     select (T)f.GetValue(null);

        if (values.Count() > 0)
        {
            return (T)(object)values.FirstOrDefault();
        }

        return default(T);
    }
0 голосов
/ 26 марта 2012

Если вам дано значение AL, и вы хотите найти значение перечисления, которое имеет этот атрибут, вы можете использовать небольшую рефлексию, чтобы выяснить это.

Допустим, наше перечисление выглядиткак это:

public enum Foo
{
    [Display(Name = "Alabama", ShortName = "AL")]
    Alabama = 1,
}

Вот небольшой код для получения Foo, который имеет атрибут ShortName = 'AL':

var shortName = "AL"; //Or whatever
var fields = typeof (Foo).GetFields(BindingFlags.Static | BindingFlags.Public);
var values = from f
                in fields
            let attribute = Attribute.GetCustomAttribute(f, typeof (DisplayAttribute)) as DisplayAttribute
            where attribute != null && attribute.ShortName == shortName
            select f.GetValue(null);
    //Todo: Check that "values" is not empty (wasn't found)
    Foo value = (Foo)values.First();
    //value will be Foo.Alabama.
0 голосов
/ 30 июня 2016

Благодаря помощи уже предоставленных ответов и некоторым дополнительным исследованиям я хотел бы поделиться своим решением в качестве метода расширения в надежде, что оно может помочь другим:

public static void GetValueByShortName<T>(this Enum e, string shortName, T defaultValue, out T returnValue)
{
    returnValue = defaultValue;

    var values = from f in typeof(T).GetFields(BindingFlags.Static | BindingFlags.Public)
                 let attribute = Attribute.GetCustomAttribute(f, typeof(DisplayAttribute)) as DisplayAttribute
                 where attribute != null && attribute.ShortName == shortName
                 select (T)f.GetValue(null);

    if (values.Count() > 0)
    {
        returnValue = (T)(object)values.FirstOrDefault();
    }
}

Вы можете использовать это расширение как таковое:

var type = MyEnum.Invalid;
type.GetValueByShortName(shortNameToFind, type, out type);
return type;
0 голосов
/ 26 марта 2012

Вы можете использовать методы Enum.Parse или Enum.TryParse класса Enum.

Образец:

CountryCodeEnum value = (CountryCodeEnum)Enum.Parse(SomeEnumStringValue);
...