Как работает IDataErrorInfo.this[string propertyName] в C#?
Я всегда реализовывал интерфейс IDataErrorInfo, не задумываясь о том, что означает эта строка и как она работает.
string IDataErrorInfo.this[string propertyName]
{
get { return this.GetValidationError(propertyName); }
}
Как .this[string propertyName]
работает, и когда / как вызывается это свойство?
2 ответа
this[key]
на самом деле является индексатором и представляет собой нечто среднее между свойством и методом. Он действует как свойство, поскольку вы можете связать его, но в отличие от обычных свойств он получает параметр.
За кулисами это реализовано как метод - get_Item(key)
и если вы хотите получить к нему доступ через отражение, вам нужно использовать Item
для имени. Например:
typeof(MyClass).GetProperty("Item");
Это также важно знать при реализации INotifyPropertyChanged
, в таком случае, "Item[]"
или же Binding.IndexerName
следует использовать в качестве имени свойства для обновления пользовательского интерфейса.
Это явная реализация интерфейса индексатора. (РЕДАКТИРОВАТЬ: IDatatErrorInfo.
часть подписи означает явную реализацию интерфейса, а .this[...]
часть означает индексатор.)
Он будет вызываться всякий раз, когда вы явно набрали IDataErrorInfo
объект, и вы используете квадратные скобки на нем, чтобы получить / получить значение при передаче строки. Например:
IDataErrorInfo myDataErrorInfo = GetErrorInfo();
string myPropertyError = myDataErrorInfo["SomePropertyName"];
Обратите внимание, что поскольку это явная реализация интерфейса, она будет доступна только тогда, когда тип известен точно как IDataErrorInfo
, Если он указан как ваш подкласс, он не будет доступен, пока этот класс не предоставит его:
MyDataErrorInfoImpl myDataErrorInfo = GetErrorInfo();
string myPropertyError = myDataErrorInfo["SomePropertyName"]; //compiler error!