У меня есть класс, давайте назовем его Book со свойством Name. С этим свойством у меня есть атрибут, связанный с ним.
public class Book
{
[Author("AuthorName")]
public string Name
{
get; private set;
}
}
В моем основном методе я использую отражение и хочу получить пару значений ключа каждого атрибута для каждого свойства. Поэтому в этом примере я ожидаю увидеть «Author» для имени атрибута и «AuthorName» для значения атрибута.
Вопрос: Как получить имя и значение атрибута в моих свойствах с помощью Reflection?
c#
reflection
propertyinfo
developerdoug
источник
источник
Ответы:
Используйте
typeof(Book).GetProperties()
для получения массиваPropertyInfo
экземпляров. Затем используйтеGetCustomAttributes()
каждыйPropertyInfo
из них, чтобы увидеть, имеет ли какой-либо из нихAuthor
тип Attribute. Если это так, вы можете получить имя свойства из информации о свойствах и значения атрибута из атрибута.Что-то вроде этих строк, чтобы сканировать тип для свойств, которые имеют определенный тип атрибута, и возвращать данные в словаре (обратите внимание, что это можно сделать более динамичным, передавая типы в подпрограмму):
источник
Чтобы получить все атрибуты свойства в словаре, используйте это:
не забудьте изменить с
false
на,true
если вы также хотите включить наследуемые атрибуты.источник
Если вам просто нужно одно конкретное значение атрибута. Например, Display Attribute, вы можете использовать следующий код:
источник
Я решил аналогичные проблемы, написав вспомогательный атрибут атрибута универсального расширения:
Использование:
источник
Fields
?Вы можете использовать
GetCustomAttributesData()
иGetCustomAttributes()
:источник
Если вы имеете в виду «для атрибутов, которые принимают один параметр, перечислите имена атрибутов и значения параметров», то это проще сделать в .NET 4.5 через
CustomAttributeData
API:источник
источник
Хотя приведенные выше ответы с наибольшим количеством голосов определенно работают, я бы предложил использовать несколько иной подход в некоторых случаях.
Если ваш класс имеет несколько свойств с всегда одним и тем же атрибутом, и вы хотите отсортировать эти атрибуты в словаре, вот как:
Это все еще использует приведение, но гарантирует, что приведение будет всегда работать, поскольку вы получите только пользовательские атрибуты типа «AuthorName». Если у вас есть несколько атрибутов выше, ответы получат исключение приведения.
источник
Использование:
или:
источник
Вот некоторые статические методы, которые вы можете использовать, чтобы получить MaxLength или любой другой атрибут.
Используя статический метод ...
Или используя необязательный метод расширения для экземпляра ...
Или используя полный статический метод для любого другого атрибута (например, StringLength) ...
Вдохновлен ответом Микаэля Энгвера.
источник
Necromancing.
Для тех, кому еще нужно поддерживать .NET 2.0, или тех, кто хочет сделать это без LINQ:
Пример использования:
или просто
источник
В этом примере я использовал DisplayName вместо Author, потому что у него есть поле с именем 'DisplayName', которое должно отображаться со значением.
источник
чтобы получить атрибут из enum, я использую:
// С помощью
источник
Просто ищу подходящее место, чтобы поместить этот кусок кода.
допустим, у вас есть следующее свойство:
И вы хотите получить значение ShortName. Ты можешь сделать:
Или сделать это вообще:
источник