2013-06-21 2 views
5

Я всегда реализовывал интерфейс IDataErrorInfo, не задаваясь вопросом, что означает эта линия и как она работает.Как работает IDataErrorInfo.this [string propertyName] на C#?

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

Как .this[string propertyName] работа, и когда/как это свойство дозвонились?

+3

I _think_ это [явная реализация интерфейса] (http://msdn.microsoft.com/en-us/library/vstudio/ms173157.aspx) [indexer] (http://msdn.microsoft.com). /en-us/library/vstudio/6x16t2tx.aspx), и он будет вызываться всякий раз, когда у вас есть явно типизированный объект IDataErrorInfo, в котором вы пишете: 'string myPropertyError = myDataErrorInfo [" SomePropertyName "];' –

+0

Yup, это просто явный интерфейс. Вы знаете об этом вообще? (Если нет, просто просмотрите его.) –

+0

@JonSkeet У меня есть приблизительное представление о том, что означает явно реализовать интерфейс (я [спросил] (http://programmers.stackexchange.com/q/136319/1130) на Programmers.SE об этом некоторое время назад), но '.this [string propertyName]' была основной частью, которую я не совсем понял. – Rachel

ответ

2

this[key] фактически индексатор, и несколько креста между свойством и методом. Он действует как свойство, поскольку вы можете привязываться к нему, но в отличие от обычных свойств он получает параметр.

За кулисами он реализован как метод - get_Item(key), и если вы хотите получить к нему доступ через отражение, вам нужно будет использовать Item для имени. Например:

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

Это также важно знать при осуществлении INotifyPropertyChanged, в этом случае, "Item[]" или Binding.IndexerName следует использовать в качестве имени свойства для обновления пользовательского интерфейса.

7

Это explicit interface implementation of indexer. (EDIT:. IDatatErrorInfo. части подписи означает явную реализацию интерфейса, а .this[...] часть означает индексатор)

Это будет называться всякий раз, когда у вас есть явно набрал IDataErrorInfo объект и использовать квадратные скобки на нем, чтобы получить/получить значение при переходе строки в Например:.

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

Обратите внимание, что поскольку это явная реализация интерфейса, он будет доступен только тогда, когда тип известен точно как IDataErrorInfo. Если вы его набрали в качестве подкласса, он не будет доступен, если этот класс не выставляет его:

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

Прошу прощения, что я не был очень ясен в своем посте. Меня больше интересовало, как работает '.this [string propertyName]', о котором вы говорили, был указателем. Я смотрю это сейчас :) Я понимаю неявные vs явные интерфейсы. – Rachel

+0

@ Rachel Ahh, я отредактировал свой ответ, чтобы понять, какая часть подписи относится к явной реализации интерфейса и индексатору. EDIT: индексы существенно позволяют реализовать синтаксис квадратного квадрата в стиле массива, но вы можете использовать любой тип, кроме просто 'int'. Они ведут себя так же, как свойства/методы и следуют тем же правилам для перегрузки/переопределения/new/virtual/abstract/etc. –

+1

Спасибо. У меня возникли проблемы с изменениями в googling * «что это значит. This [string propertyName] означает« *, чтобы придумать то, что на самом деле. Теперь, когда я знаю, что это называется индексом, мне гораздо легче найти материал об этом :) – Rachel