从自定义属性获取ENUM值

时间:2016-04-05 20:04:58

标签: c# enums custom-attributes

我有Enum,并且都有自定义属性。所以,我希望通过提供的自定义属性获得枚举值。

ENUM

public enum Language
    {
        [StringValue("af")]
        Afrikaans,
        [StringValue("sq")]
        Albanian,
        [StringValue("ar")]
        Arabic,
        [StringValue("be")]
        Belarusian,
        [StringValue("bg")]
        Bulgarian,
        [StringValue("ca")]
        Catalan
}

我尝试实现此代码,但我收到了错误" ' Type'不包含' GetTypeInfo'的定义并没有扩展方法' GetTypeInfo'接受类型'类型'的第一个参数。可以找到(你错过了使用指令或汇编引用吗?)"

using System.Reflection;

public static T GetAttribute<T>(this Enum enumValue)
        where T : Attribute
    {
        return enumValue
            .GetType()
            .GetTypeInfo()
            .GetDeclaredField(enumValue.ToString())
            .GetCustomAttribute<T>();
    }

2 个答案:

答案 0 :(得分:0)

也许是这样的:

public static T GetAttribute<T>(Enum enumValue) where T: Attribute
{
    var member = enumValue.GetType().GetMember(enumValue.ToString()).FirstOrDefault();
    return (T) member?.GetCustomAttributes(typeof (T), false).FirstOrDefault();
}

(从我的手机写,所以不能测试,所以可能是一些错字等。)

答案 1 :(得分:0)

试试这个例子:

public enum Language
{
    [LangValue(Lang.af)]
    Afrikaans,
    [LangValue(Lang.sq)]
    Albanian,
    [LangValue(Lang.ar)]
    Arabic,
    [LangValue(Lang.be)]
    Belarusian,
    [LangValue(Lang.bg)]
    Bulgarian,
    [LangValue(Lang.ca)]
    Catalan,
}

public enum Lang
{
    [LanguageValue(Language.Afrikaans)]
    af,
    [LanguageValue(Language.Albanian)]
    sq,
    [LanguageValue(Language.Arabic)]
    ar,
    [LanguageValue(Language.Belarusian)]
    be,
    [LanguageValue(Language.Bulgarian)]
    bg,
    [LanguageValue(Language.Catalan)]
    ca,
}

public class LanguageValue : Attribute
{
    public LanguageValue(Language e)
    {
        _LanguageValue = e;
    }
    public Language _LanguageValue { get; set; }
}

public class LangValue : Attribute
{
    public LangValue(Lang e)
    {
        _LangValue = e;
    }
    public Lang _LangValue { get; set; }
}

要从Lang获取Language,反之亦然:

public static class ExtensionsMethods
{
    public static Lang GetLang(this Language la)
    {
        var l = la.GetType().GetField(la.ToString()).GetCustomAttributes(typeof(LangValue), false).First() as LangValue;
        return l._LangValue;
    }
    public static Language GetLanguage(this Lang la)
    {
        var l = la.GetType().GetField(la.ToString()).GetCustomAttributes(typeof(LanguageValue), false).First() as LanguageValue;
        return l._LanguageValue;
    }
}