2010-03-22 46 views
41

Tôi cần có khả năng đọc giá trị thuộc tính của mình từ bên trong Phương pháp của tôi, làm cách nào để tôi có thể thực hiện điều đó?Đọc giá trị của thuộc tính của phương thức

[MyAttribute("Hello World")] 
public void MyMethod() 
{ 
    // Need to read the MyAttribute attribute and get its value 
} 
+0

Ngoài ra còn có phiên bản chung (bạn không cần phải đúc!) Của các phương thức này được triển khai dưới dạng phần mở rộng trong phiên bản mới hơn của .net (tôi nghĩ sau 4.0), vì vậy khách truy cập, xem các câu trả lời khác với câu trả lời – Mafii

Trả lời

53

Bạn cần phải gọi GetCustomAttributes chức năng trên một đối tượng MethodBase.
Cách đơn giản nhất để nhận đối tượng MethodBase là gọi MethodBase.GetCurrentMethod. (Lưu ý rằng bạn nên thêm [MethodImpl(MethodImplOptions.NoInlining)])

Ví dụ:

MethodBase method = MethodBase.GetCurrentMethod(); 
MyAttribute attr = (MyAttribute)method.GetCustomAttributes(typeof(MyAttribute), true)[0] ; 
string value = attr.Value; //Assumes that MyAttribute has a property called Value 

Bạn cũng có thể nhận được MethodBase bằng tay, như thế này: (Đây sẽ nhanh hơn)

MethodBase method = typeof(MyClass).GetMethod("MyMethod"); 
23
[MyAttribute("Hello World")] 
public int MyMethod() 
{ 
var myAttribute = GetType().GetMethod("MyMethod").GetCustomAttributes(true).OfType<MyAttribute>().FirstOrDefault(); 
} 
+25

Mang đến một ý nghĩa hoàn toàn mới với biểu hiện "tự phản chiếu" ... – Oded

+0

Vài năm sau, gần 3 giờ sáng và những bình luận trên hoàn toàn khiến tôi rơi nước mắt với tiếng cười ... Rực rỡ. @Oded –

+0

Hahahahah @Oded đó là người bạn đời tuyệt vời –

13

Những câu trả lời sẵn có chủ yếu là lỗi thời.

Đây là thực hành tốt nhất hiện nay:

class MyClass 
{ 

    [MyAttribute("Hello World")] 
    public void MyMethod() 
    { 
    var method = typeof(MyClass).GetRuntimeMethod(nameof(MyClass.MyMethod), new Type[]{}); 
    var attribute = method.GetCustomAttribute<MyAttribute>(); 
    } 
} 

này không yêu cầu đúc và khá an toàn khi sử dụng.

Bạn cũng có thể sử dụng .GetCustomAttributes<T> để nhận tất cả các thuộc tính của một loại.

+1

'nameof' rất hay. –

0

Nếu bạn lưu trữ các giá trị thuộc tính mặc định vào một tài sản (Name trong ví dụ của tôi) về xây dựng, sau đó bạn có thể sử dụng một phương pháp Thuộc tính helper tĩnh:

using System; 
using System.Linq; 

public class Helper 
{ 
    public static TValue GetMethodAttributeValue<TAttribute, TValue>(Action action, Func<TAttribute, TValue> valueSelector) where TAttribute : Attribute 
    { 
     var methodInfo = action.Method; 
     var attr = methodInfo.GetCustomAttributes(typeof(TAttribute), true).FirstOrDefault() as TAttribute; 
     return attr != null ? valueSelector(attr) : default(TValue); 
    } 
} 

Cách sử dụng:

var name = Helper.GetMethodAttributeValue<MyAttribute, string>(MyMethod, x => x.Name); 

My giải pháp dựa trên giá trị mặc định được đặt khi xây dựng thuộc tính, như sau:

internal class MyAttribute : Attribute 
{ 
    public string Name { get; set; } 

    public MyAttribute(string name) 
    { 
     Name = name; 
    } 
} 
Các vấn đề liên quan