简体   繁体   中英

Get ENUM value from Custom Attribute

I have Enum and all have there custom attribute. So, i want Enum value through supplied custom attribute.

ENUM

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

I try to implement this code but i got error " 'Type' does not contain a definition for 'GetTypeInfo' and no extension method 'GetTypeInfo' accepting a first argument of type 'Type' could be found (are you missing a using directive or an assembly reference?) "

using System.Reflection;

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

Maybe something like this:

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

(Writing from my phone so cannot test, so can be some typoes etc.)

Try this example:

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

In order to get the Lang from the Language and vice versa:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM