Получение атрибута из переопределенного свойства с помощью выражения 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));
Другие вопросы по тегам