获取枚举的自定义属性属性值

3

我的项目有这个BookDetails属性:

public enum Books
{
    [BookDetails("Jack London", 1906)]
    WhiteFange,

    [BookDetails("Herman Melville", 1851)]
    MobyDick,

    [BookDetails("Lynne Reid Banks", 1980)]
    IndianInTheCupboard

}

并在此处添加属性的代码:

[AttributeUsage(AttributeTargets.Field)]
public class BookDetails : Attribute
{
    public string Author { get; }
    public int YearPublished { get; }

    public BookDetails(string author, int yearPublished)
    {
        Author = author;
        YearPublished = yearPublished;
    }
}

如何获取给定书籍的作者?

尝试了这段混乱的代码,但没有起作用:

 var author = Books.IndianInTheCupboard.GetType().GetCustomAttributes(false).GetType().GetProperty("Author");  // returns null

谢谢,肯定有比我之前尝试的方法更好的。

3个回答

5

由于该属性附加到enum字段上,您应该将GetCustomAttribute应用于FieldInfo

var res = typeof(Books)
    .GetField(nameof(Books.IndianInTheCupboard))
    .GetCustomAttribute<BookDetails>(false)
    .Author;

由于属性类型在静态上下文中已知,应用泛型版本的 GetCustomAttribute<T> 方法可以更好地保证获取 Author 属性时的类型安全。

演示。


你的“Demo”链接中的代码是有效的,但片段中的代码不起作用。我在“nameof”方法上遇到了一个错误。在演示代码中,将变量res赋值给以下行: var res = typeof(Books).GetField("IndianInTheCupboard").GetCustomAttribute<BookDetails>(false).Author; - C_Sutt
1
@C_Sutt 演示的修改版本 运行良好。 - Sergey Kalinichenko
糟糕,我复制了错误的代码行。我指的是你的帖子中的那一行,而不是示例代码。var res = typeof(Books) .GetField(nameof(Books.IndianInTheCupboard)) .GetCustomAttribute<BookDetails>(false) .Author; - C_Sutt

1
你的解决方案无法正常工作,因为你试图查找类型为Books的属性,而不是枚举元素的属性。它可以工作。
var fieldInfo = typeof(Books).GetField(Books.IndianInTheCupboard.ToString());
var attribute = fieldInfo.GetCustomAttributes(typeof(BookDetails), false).FirstOrDefault() as BookDetails;
var author = attribute.Author;

如果您经常需要获取此属性的值,可以为其编写扩展程序。
public static class EnumExtensions
{
    public static BookDetails GetDescription(this Books value)
    {
        var fieldInfo = value.GetType().GetField(value.ToString());
        var attribute = fieldInfo.GetCustomAttributes(typeof(BookDetails), false).FirstOrDefault() as BookDetails;

        return attribute;
    }
}

爱上了扩展方法。 - RayLoveless

0

已经由 Bryan Rowe回答。根据你的示例,复制他的解决方案:

    var type = typeof(Books);
    var memInfo = type.GetMember(Books.IndianInTheCupboard.ToString());
    var attributes = memInfo[0].GetCustomAttributes(typeof(BookDetails), false);
    var description = ((BookDetails)attributes[0]).Author;

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