2013-06-21 8 views
5

Ich habe immer die IDataErrorInfo Schnittstelle implementiert, ohne sich wirklich zu fragen, was diese Linie bedeutet und wie sie funktioniert.Wie funktioniert IDataErrorInfo.this [string propertyName] in C#?

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

Wie .this[string propertyName] Arbeit, und wenn/wie kommt diese Eigenschaft genannt?

+3

I _think_ das ist [explizite Schnittstellenimplementierung] (http://msdn.microsoft.com/en-us/library/vstudio/ms173157.aspx) eines [indexer] (http://msdn.microsoft.com) /en-us/library/vstudio/6x16t2tx.aspx) und es würde aufgerufen werden, wenn Sie ein explizit typisiertes 'IDataErrorInfo' Objekt haben, wo Sie schreiben:' string myPropertyError = myDataErrorInfo ["SomePropertyName"]; ' –

+0

Ja, es ist nur explizit Schnittstellenimplementierung. Ist Ihnen das allgemein bekannt? (Wenn nicht, schau einfach nach.) –

+0

@JonSkeet Ich habe eine ungefähre Vorstellung davon, was es bedeutet, eine Schnittstelle explizit zu implementieren (ich [fragt] (http://programmers.stackexchange.com/q/136319/1130) an Programmierer.SE darüber eine Weile zurück), aber die '.this [String EigenschaftName]' war der Hauptteil, den ich nicht ganz verstanden habe. – Rachel

Antwort

2

this[key] in der Tat ist ein Indexer, und ist so etwas wie eine Kreuzung zwischen einer Eigenschaft und ein Verfahren. Es verhält sich wie eine Eigenschaft, da Sie es binden können, aber im Gegensatz zu regulären Eigenschaften erhält es einen Parameter.

Hinter den Kulissen ist es als Methode implementiert - get_Item(key), und wenn Sie über Reflektion zugreifen möchten, müssen Sie Item für einen Namen verwenden. Zum Beispiel:

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

Dies ist auch wichtig zu wissen, wann INotifyPropertyChanged Umsetzung, wobei in diesem Fall "Item[]" oder Binding.IndexerName soll als Eigenschaftsnamen, um die Benutzeroberfläche zu aktualisieren, verwendet werden.

7

Dies ist explicit interface implementation eines indexer. (EDIT:. Der IDatatErrorInfo. Teil der Signatur bedeutet die explizite Schnittstellenimplementierung und der .this[...] Teil bedeutet einen Indexer)

Es genannt werden würde, wenn Sie ein typisierten explizit IDataErrorInfo Objekt und Sie auf es eckige Klammer abrufen/erhalten einen Wert, während in einen String übergeben. Zum Beispiel:

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

Beachten sie, dass, da es sich um eine explizite Schnittstellenimplementierung ist, ist es nur zugänglich ist, wenn der Typ genau als IDataErrorInfo bekannt ist. Wenn Sie es eingegeben als Unterklasse haben, wird es nicht zugänglich sein, es sei denn, dass die Klasse es macht:

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

Es tut mir leid, dass ich in meiner Post nicht sehr klar war. Ich war mehr daran interessiert, herauszufinden, wie 'this [string propertyName]' funktioniert, was du erwähntest, war ein Indexer. Ich schaue das jetzt nach :) Ich verstehe implizite vs explizite Schnittstellen. – Rachel

+0

@Rachel Ahh, ich habe meine Antwort bearbeitet, um klarzustellen, welcher Teil der Signatur sich auf die explizite Schnittstellenimplementierung und den Indexer bezieht. Bearbeiten: Indexer im Wesentlichen können Sie Array-Stil eckige Klammer Syntax implementieren, aber Sie können jeden Typ neben nur "Int" verwenden. Sie verhalten sich genau wie Eigenschaften/Methoden und folgen den gleichen Regeln wie Überladen/Überschreiben/Neu/Virtuell/Abstrakt/etc. –

+1

Danke. Ich hatte Probleme beim googlen von Variationen von * "was bedeutet .dies [string propertyName]" * um herauszufinden, was es eigentlich ist. Jetzt, wo ich weiß, dass es als Indexer bezeichnet wird, habe ich viel leichter, Material darüber zu finden :) – Rachel

Verwandte Themen