如何获取枚举的自定义属性值?

问题描述:

我有一个枚举,其中每个成员都有一个自定义属性应用于它。我如何检索存储在每个属性中的值?如何获取枚举的自定义属性值?

现在我这样做:

var attributes = typeof (EffectType).GetCustomAttributes (false); 
foreach (object attribute in attributes) 
{ 
    GPUShaderAttribute attr = (GPUShaderAttribute) attribute; 
    if (attr != null) 
     return attr.GPUShader; 
} 
return 0; 

的另一个问题是,如果它没有找到,我应该怎么回报? 0是可转换为任何枚举,对吗?这就是为什么我回来的原因。

忘了提及,上面的代码为每个枚举成员返回0。

+1

可能重复://计算器.com/questions/5032774/what-attributetarget-should-i-use-for-enum-members) – 2011-02-23 22:14:02

+2

不,这是不同的。在这里,我只是试图使用反射来获取在枚举成员上设置的自定义属性。 – 2011-02-23 22:16:40

+1

[获取Enum的值的属性]的可能的重复(http://stackoverflow.com/questions/1799370/getting-attributes-of-enums-value) – 2012-01-23 10:25:06

这是一个有点乱做你正在尝试做的,你必须使用反射:

public GPUShaderAttribute GetGPUShader(EffectType effectType) 
{ 
    MemberInfo memberInfo = typeof(EffectType).GetMember(effectType.ToString()) 
               .FirstOrDefault(); 

    if (memberInfo != null) 
    { 
     GPUShaderAttribute attribute = (GPUShaderAttribute) 
        memberInfo.GetCustomAttributes(typeof(GPUShaderAttribute), false) 
           .FirstOrDefault(); 
     return attribute; 
    } 

    return null; 
} 

这将返回GPUShaderAttribute,是有关一对EffectType枚举值标记的实例。你必须把它的EffectType枚举的特定值:

GPUShaderAttribute attribute = GetGPUShader(EffectType.MyEffect); 

一旦你的属性的情况下,你可以得到的具体数值出它是对个人枚举值标记的。

+0

谢谢你,它的工作原理。我不知道这会变得如此复杂。但这是最简单的方法,对吧?你也知道为什么我的版本不起作用。我认为,因为枚举不能被实例化,所以使用enum.getCustomAttributes会起作用。 – 2011-02-23 22:32:05

+1

@Joan:据我所知,这是最简单的方法。你的方法不工作,因为你正在获取在枚举类型上定义的属性,而不是类型的值。 – adrianbanks 2011-02-23 22:35:31

+0

谢谢阿德里安,现在有道理。 – 2011-02-23 22:45:11

我还没有试过,但它看起来像这个博客帖子描述你所寻找的东西: Enumeration attribute help

有泛型做到这一点的另一种方法:

public static T GetAttribute<T>(Enum enumValue) where T: Attribute 
{ 
    T attribute; 

    MemberInfo memberInfo = enumValue.GetType().GetMember(enumValue.ToString()) 
            .FirstOrDefault(); 

    if (memberInfo != null) 
    { 
     attribute = (T) memberInfo.GetCustomAttributes(typeof (T), false).FirstOrDefault(); 
     return attribute; 
    } 
    return null; 
} 
+1

我喜欢这个,但是没有考虑到具有相同属性的多个实例的可能性。我把你所拥有的修改为使用T []而不是T,然后删除GetCustomAttributes上的FirstOrDefault()。 – 2015-07-25 22:54:15

尝试使用泛型方法

属性:

class DayAttribute : Attribute 
{ 
    public string Name { get; private set; } 

    public DayAttribute(string name) 
    { 
     this.Name = name; 
    } 
} 

枚举:

enum Days 
{ 
    [Day("Saturday")] 
    Sat, 
    [Day("Sunday")] 
    Sun, 
    [Day("Monday")] 
    Mon, 
    [Day("Tuesday")] 
    Tue, 
    [Day("Wednesday")] 
    Wed, 
    [Day("Thursday")] 
    Thu, 
    [Day("Friday")] 
    Fri 
} 

泛型方法:

 public static TAttribute GetAttribute<TAttribute>(this Enum value) 
     where TAttribute : Attribute 
    { 
     var enumType = value.GetType(); 
     var name = Enum.GetName(enumType, value); 
     return enumType.GetField(name).GetCustomAttributes(false).OfType<TAttribute>().SingleOrDefault(); 
    } 

调用:

 static void Main(string[] args) 
    { 
     var day = Days.Mon; 
     Console.WriteLine(day.GetAttribute<DayAttribute>().Name); 
     Console.ReadLine(); 
    } 

结果:

周一

[我应该使用什么AttributeTarget为枚举成员?(HTTP的
+0

希望我可以upvote这个答案100次!好东西 :-) – Gericke 2018-03-01 20:44:10