Получение атрибута из переопределенного свойства с помощью выражения linq
Я пытаюсь использовать GetCustomAttributes()
чтобы получить атрибут, определенный для свойства. Проблема в том, что свойство является переопределенным, и я не могу понять, как извлечь переопределенное из выражения. Я могу только понять, как получить базовый класс.
Вот код
public class MyAttribute : Attribute
{
//...
}
public abstract class Text
{
public abstract string Content {get; set;}
}
public class Abstract : Text
{
[MyAttribute("Some Info")]
public override string Content {get; set;}
}
Теперь я пытаюсь получить MyAttribute
из абстрактного класса. Но мне нужно получить его через Expression
, Это то, что я использовал:
Expression<Func<Abstract, string>> expression = c => c.Content;
Expression exp = expression.Body;
MemberInfo memberType = (exp as MemberExpression).Member;
var attrs = Attribute.GetCustomAttributes(memberType, true);
к несчастью atts
заканчивается как пустой. Проблема в том, что menberType
в конечном итоге для Text.Content
вместо Abstract.Content
учебный класс. Поэтому, когда я получаю атрибуты, он ничего не возвращает.
1 ответ
Это не работает, потому что MemberExpression
игнорирует переопределения и возвращает свойство из базового типа Text
вот почему вы не нашли свой атрибут.
Вы можете прочитать об этой проблеме здесь: Как получить дочернее объявление типа из выражения?
Тем не менее, у вас есть вся информация в выражении, и вы можете получить свой атрибут немного больше размышлений (быстрый и грязный пример):
Expression<Func<Abstract, string>> expression = (Abstract c) => c.Content;
Expression exp = expression.Body;
MemberInfo memberType = (exp as MemberExpression).Member;
var attrs = Attribute.GetCustomAttributes(
expression.Parameters[0].Type.GetProperty(memberType.Name));