Получить значения параметров пользовательских атрибутов? - PullRequest
8 голосов
/ 13 октября 2010

если я создал атрибут:

public class TableAttribute : Attribute {
    public string HeaderText { get; set; }
}

, который я применяю к нескольким своим свойствам в классея отображаю в таблице ... как я могу получить значение HeaderText для использования в качестве заголовков моих столбцов?Что-то вроде ...

<th><%:HeaderText%></th>

Ответы [ 2 ]

28 голосов
/ 13 октября 2010

В этом случае вы сначала получите соответствующий PropertyInfo, а затем вызовете MemberInfo.GetCustomAttributes (передав тип вашего атрибута). Приведите результат к массиву вашего типа атрибута, а затем получите свойство HeaderText как обычно. Пример кода:

using System;
using System.Reflection;

[AttributeUsage(AttributeTargets.Property)]
public class TableAttribute : Attribute
{
    public string HeaderText { get; set; }
}

public class Person
{
    [Table(HeaderText="F. Name")]
    public string FirstName { get; set; }

    [Table(HeaderText="L. Name")]
    public string LastName { get; set; }
}

public class Test 
{
    public static void Main()
    {
        foreach (var prop in typeof(Person).GetProperties())
        {
            var attrs = (TableAttribute[]) prop.GetCustomAttributes
                (typeof(TableAttribute), false);
            foreach (var attr in attrs)
            {
                Console.WriteLine("{0}: {1}", prop.Name, attr.HeaderText);
            }
        }
    }
}
3 голосов
/ 17 ноября 2017

Решение Jon Skeet хорошо, если вы разрешаете объявлять несколько атрибутов одного типа в свойстве.(AllowMultiple = true)

ex:

[Table(HeaderText="F. Name 1")]
[Table(HeaderText="F. Name 2")]
[Table(HeaderText="F. Name 3")]
public string FirstName { get; set; }

В вашем случае я бы предположил, что вы хотите, чтобы для каждого свойства был разрешен только один атрибут.В этом случае вы можете получить доступ к свойствам пользовательского атрибута через:

var tableAttribute= propertyInfo.GetCustomAttribute<TableAttribute>();
Console.Write(tableAttribute.HeaderText);
// Outputs "F. Name" when accessing FirstName
// Outputs "L. Name" when accessing LastName
...