2008-11-19 29 views

Trả lời

30

Không - có nhiều hơn. ComponentModel cho phép bạn thực hiện một số thứ kiểu DLR, chẳng hạn như các thuộc tính thời gian chạy. Đây là cách một DataView cho thấy các cột vào một lưới - chúng không phải là các thuộc tính phản chiếu - chúng là các thuộc tính thời gian chạy. Các từ khóa ở đây là ICustomTypeDescriptorTypeDescriptionProvider.

Mô hình này cũng cho phép trừu tượng và vô hướng. Ví dụ, nếu bạn đang làm rất nhiều sự phản ánh trên các thuộc tính, hãy xem xét HyperDescriptor - đây là một tiện ích mà tôi đã viết sử dụng thực hiện PropertyDescriptor tùy chỉnh để hoán đổi mô hình phản chiếu cho một mô hình được biên dịch trước, để tăng hiệu suất rất lớn.

Về mặt sử dụng, có một số khác biệt khác; ComponentModel chỉ hỗ trợ một cá thể duy nhất của bất kỳ thuộc tính nào trên một thành viên (không giống như sự phản chiếu, trong đó nhiều thuộc tính giống nhau được cho phép). Và đó là trung tâm dữ liệu - vì vậy các thuộc tính tồn tại, cũng như các sự kiện (chủ yếu dành cho thông báo thay đổi) - nhưng không có trường và phương thức nào.

Nó cũng có hỗ trợ tốt cho i18n - kể từ DisplayName vv có thể được tùy chỉnh khi đang di chuyển.

Tuy nhiên, ComponentModel không (trực tiếp) tương thích với những thứ như LINQ (MemberExpression nói riêng) - vì điều này muốn liên kết với dữ liệu phản ánh.

Cuối cùng, ComponentModel được sử dụng rất nhiều trong IDE bởi những thứ như PropertyGrid (đây là những thứ như các thuộc tính phụ cho công cụ mẹo), nhưng hầu như tất cả các ràng buộc dữ liệu UI đều xảy ra thông qua ComponentModel (vì điều này cho phép ràng buộc hỗ trợ DataTable, các lớp và bất kỳ thứ gì khác mà bạn có thể nghĩ đến).

+0

Tôi biết điều này là cũ hơn những ngọn đồi nhưng bạn có thể giải thích một số điều bạn có thể và không thể làm trong LINQ nếu bạn sử dụng System.ComponentModel để phản ánh? – wootscootinboogie

+0

@woot đó là câu trả lời ngắn: LINQ không quan tâm đến ComponentModel –