У меня есть 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));
}
Комментариев нет:
Отправить комментарий