2013-06-21 22 views
5

Ho sempre implementato l'interfaccia IDataErrorInfo senza realmente chiedermi cosa significa questa linea e come funziona.In che modo IDataErrorInfo.this [string propertyName] funziona in C#?

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

Come .this[string propertyName] lavoro, e quando/come fa questa proprietà ottiene chiamato?

+3

I _think_ this is [implementazione dell'interfaccia esplicita] (http://msdn.microsoft.com/en-us/library/vstudio/ms173157.aspx) di un [indicizzatore] (http://msdn.microsoft.com /en-us/library/vstudio/6x16t2tx.aspx) e verrebbe chiamato ogni volta che si ha un oggetto 'IDataErrorInfo' esplicitamente digitato dove si scrive:' string myPropertyError = myDataErrorInfo ["SomePropertyName"]; ' –

+0

Sì, è solo esplicito implementazione dell'interfaccia. Ne sei consapevole in generale? (In caso contrario, basta cercare.) –

+0

@JonSkeet Ho una vaga idea di cosa significhi implementare un'interfaccia esplicitamente (ho [chiesto] (http://programmers.stackexchange.com/q/136319/1130) su Programmers.SE circa un po 'di tempo fa), ma il '.questo [string propertyName]' era la parte principale che non capivo bene. – Rachel

risposta

2

this[key] è infatti un indicizzatore, ed è un po 'un incrocio tra una proprietà e un metodo. Agisce come una proprietà poiché è possibile legarsi ad essa, ma al contrario delle proprietà regolari, riceve un parametro.

Dietro le quinte è implementato come metodo - get_Item(key) e, se si desidera accedervi tramite riflessione, è necessario utilizzare Item per un nome. Ad esempio:

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

Questo è anche importante sapere quando attuazione INotifyPropertyChanged, nel qual caso, "Item[]" o Binding.IndexerName dovrebbe essere usato come un nome di proprietà per aggiornare l'interfaccia utente.

7

Questo è explicit interface implementation di un indexer. (EDIT:. La IDatatErrorInfo. parte della firma indica l'implementazione dell'interfaccia esplicita, e la parte .this[...] significa un indicizzatore)

sarebbe chiamato ogni volta che avete un digitato esplicitamente IDataErrorInfo oggetto e si utilizza le parentesi quadre su di esso per recuperare/ottenere un valore passando una stringa. Ad esempio:

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

notare che, poichè è un'implementazione esplicita, sarà solo accessibile quando il tipo è noto esattamente come IDataErrorInfo. Se lo avete digitato come sottoclasse, non sarà accessibile a meno che la classe lo espone:

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

Mi dispiace di non essere stato molto chiaro nel mio post. Ero più interessato a scoprire come funziona '.this [string propertyName] ', che hai menzionato come un indicizzatore. Lo sto osservando ora :) Capisco le interfacce implicite vs esplicite. – Rachel

+0

@ Rachel Ahh, ho modificato la mia risposta per chiarire quale parte della firma si riferisce all'implementazione dell'interfaccia esplicita e all'indicizzatore. EDIT: gli indexer ti permettono essenzialmente di implementare la sintassi della parentesi quadra in stile array, ma ti permettono di usare qualsiasi tipo oltre a 'int'. Si comportano come proprietà/metodi e seguono le stesse regole per sovraccaricare/sovrascrivere/nuovo/virtuale/astratto/ecc. –

+1

Grazie. Stavo avendo problemi a cercare le varianti di * "cosa significa .questo [string propertyName] significa" * far emergere quello che è in realtà. Ora che so che è indicato come un indicizzatore, sto trovando molto più facile trovare del materiale a riguardo :) – Rachel

Problemi correlati