获取枚举值的自定义属性

21
在一个WinRT .NET应用程序(C#)中,我想获取在枚举值上定义的自定义属性。以以下枚举为例:
public enum MyEnum
{
    [Display(Name="Foo")]
    EnumValue1,

    [Display(Name="Bar")]
    EnumValue2
}

在“普通”的.NET中,我知道通过enumValue.GetType().GetMember(enumValue.ToString())可以获取枚举值的自定义属性。

不幸的是,在WinRT .NET中,Type类上的GetMember()方法不可用。
有什么建议吗?

=====================================================

感谢下面的Marc,我找到了答案!以下代码适用于在.NET 4.5 WinRT中从枚举值获取特定自定义属性:

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

请不要在标题前加上“WinRT C#:”等内容。这就是标签的作用。 - John Saunders
这是不可能的。Type.GetMember在.Net 4.5中仍然存在! - logicnp
@logicnp: WinRT API是完整.NET API的子集。 - Jon Skeet
不,它没有在System命名空间的Type类中定义。配置:Windows Consumer Preview,VS11 Beta,程序集C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.Runtime.dll。 - Matthias
@JonSkeet:我错了!然而,除了通过Intellisense/编译时错误之外,有什么方法可以知道WinRT中是否存在一个API呢? API文档页面http://msdn.microsoft.com/en-us/library/system.type.getmember%28v=vs.110%29.aspx没有像Silverlight那样对WinRT进行过滤器。 - logicnp
@logicnp:目前WinRT有一套独立的文档,我相信。它们是否在发布后将其合并到主要的.NET文档中是另一回事。 - Jon Skeet
1个回答

14

与其寻找 成员,你应该特别寻找字段。如果在WinRT的Type中不可用,则添加using System.Reflection;并使用type.GetTypeInfo()。同时,在那里查看,因为各种反射方面都移动到类型信息。


谢谢,那解决了问题!我在上面补充了答案。 - Matthias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接