2012-04-25 127 views
5

我試圖使用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類。所以當我得到這些屬性時,它什麼都不返回。

回答

3

它不工作,因爲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)); 
+0

感謝您提供其他問題的鏈接。我搜索了類似的東西,但沒有找到那個。 – Jero 2012-04-30 20:54:59

+0

你給的解決方案是我一直在使用到現在很高興得到一些獨立支持的工作:-)謝謝 – Jero 2012-04-30 20:56:04