【问题标题】:Get ENUM value from Custom Attribute从自定义属性中获取 ENUM 值
【发布时间】:2016-04-05 20:04:58
【问题描述】:

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

枚举

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

我尝试实现此代码,但出现错误“'Type' 不包含'GetTypeInfo' 的定义,并且找不到接受'Type' 类型的第一个参数的扩展方法'GetTypeInfo'(是您缺少 using 指令或程序集引用?)

using System.Reflection;

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

【问题讨论】:

标签: c# enums custom-attributes


【解决方案1】:

可能是这样的:

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

(用我的手机写,所以无法测试,所以可能是一些错别字等)

【讨论】:

    【解决方案2】:

    试试这个例子:

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

    为了从Language 中获取Lang,反之亦然:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2015-05-06
      相关资源
      最近更新 更多