通过linq获取重写属性的属性表达式
问题描述:
我试图使用GetCustomAttributes()
来获取在属性上定义的属性。问题是该属性是一个被覆盖的属性,我不能解决如何从表达式中提取被覆盖的属性。我只能研究如何获得基类的一个。通过linq获取重写属性的属性表达式
下面是一些代码
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
类。所以当我得到这些属性时,它什么都不返回。
答
它不工作,因为MemberExpression
忽略覆盖并返回属性形式的基本类型Text
这就是为什么你没有找到你的属性。
你可以阅读关于这个问题就在这里:How to get the child declaring type from an expression?
但是你必须在表达式中的所有信息,你可以多一点思考(快速和肮脏的样本)让你的属性:
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));
感谢您提供其他问题的链接。我搜索了类似的东西,但没有找到那个。 – Jero 2012-04-30 20:54:59
你给的解决方案是我一直在使用到现在很高兴得到一些独立支持的工作:-)谢谢 – Jero 2012-04-30 20:56:04