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


person Jero    schedule 25.04.2012    source источник


Ответы (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));
person nemesv    schedule 26.04.2012
comment
Спасибо за ссылку на другой вопрос. Искал что-то похожее, но не нашел. - person Jero; 01.05.2012
comment
Это решение, которое вы дали, - это работа, которую я использовал до сих пор, поэтому приятно получить независимую поддержку для этого решения :-) Спасибо. - person Jero; 01.05.2012