2012-04-25 29 views
5

Tôi đang cố gắng sử dụng GetCustomAttributes() để nhận thuộc tính được xác định trên thuộc tính. Vấn đề là thuộc tính là một thuộc tính bị ghi đè và tôi không thể tìm ra cách trích xuất thuộc tính bị ghi đè từ biểu thức. Tôi chỉ có thể tìm ra cách để có được lớp cơ bản.Lấy thuộc tính từ thuộc tính ghi đè thông qua Biểu thức LINQ

Dưới đây là một số mã

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;} 
} 

Bây giờ tôi đang cố gắng để có được những MyAttribute ra khỏi lớp trừu tượng. Nhưng tôi cần lấy nó qua số Expression. Đây là những gì tôi đã sử dụng:

Expression<Func<Abstract, string>> expression = c => c.Content; 
Expression exp = expression.Body; 
MemberInfo memberType = (exp as MemberExpression).Member; 

var attrs = Attribute.GetCustomAttributes(memberType, true); 

Thật không may atts kết thúc khi trống. Vấn đề là menberType sẽ kết thúc với số Text.Content thay vì lớp Abstract.Content. Vì vậy, khi tôi nhận được các thuộc tính, nó trả về không có gì.

Trả lời

3

Nó không hoạt động vì MemberExpression bỏ qua ghi đè và trả về biểu mẫu thuộc tính loại cơ sở Text đó là lý do tại sao bạn không tìm thấy thuộc tính của mình.

Bạn có thể đọc về vấn đề này ở đây: How to get the child declaring type from an expression?

Tuy nhiên bạn có tất cả các thông tin trong biểu hiện và bạn có thể nhận được thuộc tính của bạn với một chút suy nghĩ nhiều hơn (mẫu nhanh chóng và bẩn):

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

Cảm ơn bạn đã liên kết đến câu hỏi khác. Tôi đã tìm kiếm một cái gì đó tương tự nhưng không tìm thấy cái đó. – Jero

+0

Giải pháp mà bạn đưa ra là công việc xung quanh tôi đã sử dụng cho đến bây giờ rất tốt đẹp để có được một số hỗ trợ độc lập cho rằng một :-) Cảm ơn – Jero

Các vấn đề liên quan