当我只有一个简短的显示名称时如何获得枚举?

时间:2012-03-26 14:52:16

标签: asp.net-mvc-3 enums displaytag

我得到一个Short Diplay名称,我需要使用它获得枚举值吗?

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

我刚从外部数据库获取AL。我需要以某种方式阅读我的枚举并获得适当的价值。谢谢你的帮助。

4 个答案:

答案 0 :(得分:0)

您可以使用Enum类的Enum.ParseEnum.TryParse方法。

样品:

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

答案 1 :(得分:0)

如果给出值AL,并且想要找到具有该属性的枚举值,则可以使用一点反射来计算出来。

让我们说我们的枚举看起来像这样:

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

这是一个小代码,用于获取具有ShortName ='AL'属性的Foo

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.

答案 2 :(得分:0)

感谢已经给出的答案和一些其他研究的帮助,我想将此解决方案作为一种扩展方法分享,希望它可以帮助其他人:

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;

答案 3 :(得分:0)

@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);
    }