2010-04-15 39 views
7

xem xét như sau:Làm thế nào để bạn phản ánh trên một thuộc tính được áp dụng cho một giá trị trả về?

[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.ReturnValue)] 
public class NotNullAttribute : Attribute 
{ 
} 

public class Class1 
{ 
    [return: NotNull] 
    public static string TestMethod([NotNull] string arg) 
    { 
     return arg + " + " + arg; 
    } 
} 

thế nào, using System.Reflection, bạn sẽ thấy rằng các thuộc tính NotNullAttribute đã được áp dụng cho các giá trị trả về của phương pháp này? Nếu bạn không thể, mục đích đằng sau cú pháp [return:] là gì?

Trả lời

9

MethodInfo có thuộc tính ReturnTypeCustomAttributes, nếu bạn gọi hàm GetCustomAttributes(), bạn sẽ nhận được giá trị trả về atrtibutes.

MethodInfo mi = typeof(Class1).GetMethod("TestMethod"); 
object[] attrs = mi.ReturnTypeCustomAttributes.GetCustomAttributes(true); 
+0

Gah. Câu trả lời của bạn khiến tôi nhận ra rằng PostSharp đang sử dụng MethodBase, và đó là lý do tại sao không có sẵn. Cảm ơn. – Amy

+2

BTW, nếu bạn đang tải hội đồng vào một ngữ cảnh READ-CHỈ (mà tôi đã mặc dù trường hợp thử nghiệm đơn giản của tôi ở trên không làm như vậy), giải pháp này thực sự sẽ không hoạt động. Thay vào đó, bạn phải sử dụng: CustomAttributeData.GetCustomAttribute (methodInfo.ReturnParameter) –

+3

Ngoài ra còn có 'mi.ReturnParameter.GetCustomAttributes' vv @Amy, Lý do tại sao chúng không có sẵn trên' MethodBase' dường như là các hàm tạo không cho phép các kiểu trả về, trong khi "các phương thức non-constructor" làm (chúng là các phương thức C#, các trình truy cập C# cho các thuộc tính/các trình lập chỉ mục/các sự kiện, các toán tử C#). Các phương thức trả về 'void' cũng có thể có các thuộc tính tùy chỉnh trên các giá trị trả về của chúng! –

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