6

我正在尝试使用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最终是 forText.Content而不是Abstract.Content类。所以当我得到属性时,它什么也不返回。

4

1 回答 1

4

它不起作用,因为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));
于 2012-04-26T05:52:01.793 回答