2010-06-11 56 views
10

Ai đó có thể vui lòng cho tôi một ví dụ về việc sử dụng Attribute.isDefined() để kiểm tra xem một thuộc tính tùy chỉnh cụ thể đã được áp dụng cho một lớp nhất định không?C# Attribute.isDefined() ví dụ?

Tôi đã kiểm tra msdn, nhưng chỉ thấy các thuộc tính cho các thuộc tính được áp dụng cho các hội đồng, thành viên, v.v. Tôi cũng mở ra các phương pháp thay thế để đạt được điều tương tự!

Trả lời

6

Một ví dụ đơn giản:

using System; 
using System.Diagnostics; 

[Foo] 
class Program { 
    static void Main(string[] args) { 
     var t = typeof(Program); 
     var ok = Attribute.IsDefined(typeof(Program), typeof(FooAttribute)); 
     Debug.Assert(ok); 
    } 
} 

class FooAttribute : Attribute { } 
+0

Đó là việc kiểm tra một thành viên - điều gì về một thuộc tính trên một lớp học? Có lẽ các công trình tương tự? – UpTheCreek

+2

Đó là * rất * không trực quan, lớp Kiểu thừa kế MemberInfo. Vì vậy, quá tải IsDefined (MemberInfo, Type) được thực hiện công việc. Đã cập nhật đoạn mã. –

+0

Ah tôi hiểu rồi, cảm ơn! – UpTheCreek

2

Dường như không quá tải Attribute.IsDefined mất Type.

Thay vào đó, Bạn có thể gọi Type.GetCustomAttributes:

if (typeof(SomeClass).GetCustomAttributes(typeof(SomeAttribute), false).Length > 0) 
+0

Cảm ơn. Tôi tự hỏi tại sao không có quá tải? Tôi muốn làm việc với các thuộc tính là một chút sạch hơn. Thật hấp dẫn khi sử dụng giao diện điểm đánh dấu và (SomeClass là SomeMarkerInterface). – UpTheCreek

+1

Có * là * quá tải, IsDefined (MemberInfo, Type) được thực hiện công việc. Tôi cũng ngạc nhiên về điều này :) –

1

Các Type class kế thừa MemberInfo.
Vì vậy, bạn có thể sử dụng overload mà phải mất một MemberInfo:

if (Attribute.IsDefined(typeof(SomeClass), typeof(SomeAttribute)) 
+0

Ah, cảm ơn đó là đẹp hơn trên mắt hơn liên quan đến chiều dài :) – UpTheCreek