2012-03-01 29 views

Trả lời

8

Điều này là do đặc tả CLI không thực thi các thuộc tính đó lấy được từ Thuộc tính.

Các đặc điểm kỹ thuật, trong II Part 21 (trang 225), khẳng định:

Trong khi bất kỳ người dùng định nghĩa loại có thể được sử dụng như là một thuộc tính, CLS tuân thủ yêu cầu các thuộc tính sẽ là trường hợp của loại có lớp cơ sở là System.Attribute. CLI định trước một số loại thuộc tính và sử dụng chúng để kiểm soát hành vi thời gian chạy của . Một số ngôn ngữ xác định trước các loại thuộc tính để thể hiện các tính năng ngôn ngữ không trực tiếp được trình bày trong CTS. Người dùng hoặc các công cụ khác được hoan nghênh xác định và sử dụng các loại thuộc tính bổ sung.

Về cơ bản, bản thân CLR không thể đảm bảo rằng kết quả sẽ là Thuộc tính - điều này chỉ đúng trong các ngôn ngữ tuân thủ CLS. Các ngôn ngữ không tuân thủ CLS được phép có các thuộc tính của bất kỳ loại nào, mà có nghĩa là ICustomAttributeProvider.GetCustomAttributes (là giao diện được triển khai đang được đề cập đến) cần cung cấp một cơ chế để lấy các thuộc tính có nguồn gốc không thuộc tính.

+0

Cảm ơn, điều này có ý nghĩa. –

0

mỗi MSDN: http://msdn.microsoft.com/en-us/library/kff8s254.aspx

This method ignores the inherit parameter for properties and events. 
To search the inheritance chain for attributes on properties and events, 
use the appropriate overloads of the Attribute.GetCustomAttributes method. 

hiểu biết của tôi là nó cho phép bạn có thể thậm chí tùy chỉnh một thuộc tính mà không kế thừa từ System.Attribute nhưng viết hoàn toàn "thuộc tính" của riêng bạn, với sự linh hoạt đó, bạn "Thuộc tính" có thể chỉ được kế thừa Object đôi khi

0

Ngoài những gì Reed đã nói ở trên, API MemberInfo.GetCustomAttributes cho phép bạn chỉ định loại bộ lọc ảnh hưởng đến loại mảng đang được trả lại. Tức là, khi bạn chỉ định typeof (MyAttribute), kết quả sẽ thực sự là MyAttribute[] (truyền tới object[]).

Bây giờ, khi bạn chỉ định loại giao diện IMyAttribute, mảng có loại IMyAttribute[]. Và trong khi có thể truyền IMyAttribute[] đến object[], bạn không thể truyền nó đến Attribute[]. Vì vậy, về bản chất, là kết quả của một Attribute[], lọc dựa trên giao diện sẽ không hoạt động.

(BTW, mới hơn Attribute.GetCustomAttributes API - sửa lỗi độ phân giải thừa kế cho thuộc tính và sự kiện - có Attribute[] làm kiểu trả về. Điều này giúp lọc dựa trên các giao diện không thể, bạn sẽ nhận được một ArgumentException khi cố gắng chuyển vào loại giao diện cho lọc.)

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