Страницы

Поиск по вопросам

четверг, 14 февраля 2019 г.

Как достучаться до свойств атрибута?

У меня есть Type атрибута. Я разбираю Assembly по типам, которые имеют нужный атрибут.
types = ass.GetTypes().Where(t => t.CustomAttributes.Any(a => a.AttributeType == utilTypes[1]));
То есть получаю список типов. Мне нужно, перебирая этот список, достать свойства атрибута. Ну например вот из этого
[MyAttribute("Hello")] class MyClass{}
мне нужно достать свойство Prop1, которое равно "Hello". Как это сделать? Чего то уже совсем запутался в этих рефлекциях :(
UPD1
Забыл сказать. У меня нет прямого доступа к типу атрибута. То есть я не могу сделать так
foreach (var type in types) { var MyAttr = (MyAttributeAttribute)type.GetCustomAttribute(utilTypes[0].GetType()) }
Потому что этот самый тип атрибута MyAttributeAttribute я имею только в текстовом виде. А значит мне нужно каким то образом достать из него свойство, к которому я не имею прямой доступ


Ответ

Попробуйте следующий подход. Пусть тип экземпляра класса MyClass лежит в переменной type. То есть:
Type type = typeof(MyClass);
Или в вашем случае:
Type type = types[i];
Тогда следующий код:
var attr = type.CustomAttributes.FirstOrDefault(a => a.AttributeType == utilTypes[0]); if (attr != null) { var attrType = attr.AttributeType; var propInfo = attrType.GetProperty("Prop1", BindingFlags.Instance | BindingFlags.Public); Console.WriteLine(propInfo.GetValue(mcType.GetCustomAttribute(attrType))); }
Выведет:
Hello

Вот, оформил в виде метода:
public static object GetAttributeProperty(Type classType, Type attributeType, string propertyName) { var propInfo = attributeType.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public); return propInfo.GetValue(classType.GetCustomAttribute(attributeType)); }

Комментариев нет:

Отправить комментарий