Как работает 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!
Другие вопросы по тегам