2013-06-21 38 views
5

Tôi đã luôn triển khai giao diện IDataErrorInfo mà không thực sự tự hỏi ý nghĩa của dòng này và cách hoạt động của nó.IDataErrorInfo.this [string propertyName] hoạt động như thế nào trong C#?

string IDataErrorInfo.this[string propertyName] 
{ 
    get { return this.GetValidationError(propertyName); } 
} 

.this[string propertyName] hoạt động như thế nào và khi nào thì tài sản này được gọi?

+3

Tôi _think_ đây là [triển khai giao diện rõ ràng] (http://msdn.microsoft.com/en-us/library/vstudio/ms173157.aspx) của [indexer] (http://msdn.microsoft.com /en-us/library/vstudio/6x16t2tx.aspx) và nó sẽ được gọi bất cứ khi nào bạn có một đối tượng 'IDataErrorInfo' được gõ rõ ràng nơi bạn viết:' string myPropertyError = myDataErrorInfo ["SomePropertyName"]; ' –

+0

Yup, nó chỉ rõ ràng thực hiện giao diện. Bạn có biết điều đó nói chung không? (Nếu không, chỉ cần nhìn nó lên.) –

+0

@JonSkeet Tôi có một ý tưởng thô về ý nghĩa của việc thực hiện một giao diện một cách rõ ràng (tôi [yêu cầu] (http://programmers.stackexchange.com/q/136319/1130) về Programmers.SE về điều đó một lúc trở lại), nhưng '.this [string propertyName]' là phần chính mà tôi không hiểu lắm. – Rachel

Trả lời

2

this[key] thực chất là một indexer, và có một chút của sự pha trộn giữa một tài sản và một phương pháp. Nó hoạt động như một thuộc tính vì bạn có thể liên kết với nó, nhưng trái ngược với các thuộc tính thông thường, nó nhận một tham số.

Hậu trường được triển khai như một phương thức - get_Item(key) và nếu bạn muốn truy cập thông qua phản ánh, bạn cần sử dụng Item để đặt tên. Ví dụ:

typeof(MyClass).GetProperty("Item"); 

Đây cũng là quan trọng để biết khi nào thực hiện INotifyPropertyChanged, trong trường hợp này, "Item[]" hoặc Binding.IndexerName nên được sử dụng như một tên thuộc tính để cập nhật giao diện người dùng.

7

Đây là explicit interface implementation trong số indexer. (EDIT:. Các IDatatErrorInfo. phần của chữ ký nghĩa việc thực hiện giao diện rõ ràng, và phần .this[...] nghĩa một indexer)

Nó sẽ được gọi bất cứ khi nào bạn có một đánh máy rõ ràng IDataErrorInfo đối tượng và bạn sử dụng dấu ngoặc vuông vào nó để lấy/được một giá trị trong khi đi qua một chuỗi trong Ví dụ:.

IDataErrorInfo myDataErrorInfo = GetErrorInfo(); 
string myPropertyError = myDataErrorInfo["SomePropertyName"]; 

Lưu ý rằng kể từ khi nó là một giao diện thực hiện rõ ràng, nó sẽ chỉ có thể truy cập khi loại được biết đến chính xác như một IDataErrorInfo. Nếu bạn có nó gõ như phân lớp của bạn, nó sẽ không thể truy cập trừ khi lớp đó cho thấy nhiều nó:

MyDataErrorInfoImpl myDataErrorInfo = GetErrorInfo(); 
string myPropertyError = myDataErrorInfo["SomePropertyName"]; //compiler error! 
+0

Tôi xin lỗi vì tôi không rõ ràng trong bài đăng của mình. Tôi đã quan tâm nhiều hơn trong việc tìm ra cách '.this [string propertyName]' works, mà bạn đã đề cập là một người lập chỉ mục. Tôi đang tìm kiếm rằng bây giờ :) Tôi hiểu ngầm và giao diện rõ ràng. – Rachel

+0

@Rachel Ahh, tôi đã chỉnh sửa câu trả lời của mình để rõ ràng phần nào của chữ ký đề cập đến việc triển khai giao diện rõ ràng và người lập chỉ mục. EDIT: Các chỉ mục về cơ bản cho phép bạn thực hiện cú pháp khung vuông kiểu mảng nhưng cho phép bạn sử dụng bất kỳ loại nào ngoài 'int'. Chúng hoạt động giống như các thuộc tính/phương thức và tuân theo các quy tắc tương tự cho quá tải/ghi đè/new/virtual/abstract/etc. –

+1

Cảm ơn bạn. Tôi đã gặp rắc rối với các biến thể của * "cái gì. This [string propertyName] có nghĩa là" * để tìm ra nó thực sự là gì. Bây giờ tôi biết nó được gọi là một người lập chỉ mục, tôi đang có một thời gian dễ dàng hơn nhiều trong việc tìm kiếm tài liệu về nó :) – Rachel

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