Chỉ tò mò, xem MemberInfo.GetCustomAttributes
. Nó gợi ý rằng nó có thể chứa một đối tượng không thuộc tính?Tại sao GetCustomAttributes trả về đối tượng [] thay vì Thuộc tính []?
Trả lời
Đ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.
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
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.)
- 1. Tại sao chuỗi Request.Cookies trả về thay vì đối tượng HttpCookie trong vòng lặp foreach?
- 2. Tại sao HttpUtility.UrlEncode (HttpUtility.UrlDecode ("% 20")) trả về + thay vì% 20?
- 3. Tại sao loại của javascript luôn trả về "đối tượng"?
- 4. Tại sao đối tượng Enum.Parse() trả lại?
- 5. Không thể truy cập thuộc tính đối tượng, mặc dù nó tồn tại. Trả về undefined
- 6. GetCustomAttributes không trả lại giá trị
- 7. Tại sao thuộc tính đối tượng này không xác định?
- 8. Tại sao ISerializationSurrogate.SetObject trả về một đối tượng cũng như lấy một đối tượng để điền?
- 9. Sao chép thuộc tính đối tượng Javascript
- 10. Rails 3, truy vấn Active Record trả về ActiveRecord :: Đối tượng quan hệ, thay vì đối tượng
- 11. Tại sao mảng typeof với đối tượng trả về "Đối tượng" chứ không phải "Mảng"?
- 12. Tại sao nhiều thuộc tính trong WPF lại là 'Object' thay vì giao diện?
- 13. OptionParser trả về bool thay vì đối số?
- 14. đối tượng trả về chung
- 15. Cách trả về ID phần tử thay vì [đối tượng HTMLDivElement] (Prototype.js)
- 16. Tại sao C# Math.floor() trả đúp thay vì Int
- 17. Tại sao trình bày trang thuộc tính hiển thị "đối tượng không có thuộc tính"?
- 18. Lặp lại các mảng đối tượng và các thuộc tính trả về
- 19. Thay đổi PowerShell trả về loại đối tượng
- 20. Tại sao thư viện Boost lại trả về "chuyển đổi thành` bool` "thay vì chỉ trả về` bool`?
- 21. Tại sao Entity Framework trả về null List <> thay vì rỗng?
- 22. PHP json_encode trả về các hàng dưới dạng đối tượng thay vì mảng
- 23. trả về một đối tượng dấu thời gian mặc định thay vì null
- 24. Tại sao SUM (...) trên một bản ghi trống rỗng trả về NULL thay vì 0?
- 25. C# MVC4 Web API - Kết quả JSON sẽ trả về các đối tượng thay vì $ ref thành đối tượng
- 26. Đối tượng hiển thị các thuộc tính nhưng truy cập chúng trả về không xác định
- 27. Tại sao trả lại NotImplemented thay vì nâng NotImplementedError
- 28. Tại sao getClass trả về tên của lớp + $ 1 (hoặc $ *)
- 29. Tại sao nó tốt hơn (Return IList Thay vì trả về List)?
- 30. Loại (3,) trả về một số nguyên thay vì một tuple trong python, tại sao?
Cảm ơn, điều này có ý nghĩa. –