2013-06-21 10 views
5

私は常にIDataErrorInfoインターフェイスを実装しましたが、実際にこのラインの意味と動作の仕方は不明です。IDataErrorInfo.this [string propertyName]はどのようにC#で動作しますか?

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

.this[string propertyName]はどのように機能し、どのようにこのプロパティが呼び出されますか?

+3

I _think_ [indexer](http://msdn.microsoft.com)の[明示的なインターフェイス実装](http://msdn.microsoft.com/en-us/library/vstudio/ms173157.aspx)です。 /en-us/library/vstudio/6x16t2tx.aspx)明示的に型指定された 'IDataErrorInfo'オブジェクトがあるときはいつでも呼び出されます:' string myPropertyError = myDataErrorInfo ["SomePropertyName"]; ' –

+0

インタフェース実装。それは一般的に分かっていますか? (もしそうでなければ、ちょうどそれを見てください) –

+0

@JonSkeet私は、インターフェイスを明示的に実装することが何を意味しているのか、大まかに考えています(http://programmers.stackexchange.com/q/136319/1130)。 Programmers.SEについてはもう少し前のことですが) 'この[string propertyName]'は私があまり理解していなかった主要な部分でした。 – Rachel

答えて

2

this[key]は、実際には、インデクサで、プロパティとメソッドとの間のクロスの多少です。バインドできるのでプロパティのように動作しますが、通常のプロパティとは異なり、パラメータを受け取ります。

舞台裏では、メソッドとしてget_Item(key)が実装されています。リフレクションでアクセスするには、Itemという名前を使用する必要があります。たとえば:

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

これはINotifyPropertyChangedを実装する際に知っておくことも重要であるが、その場合には、"Item[]"またはBinding.IndexerNameは、UIを更新するために、プロパティ名として使用する必要があります。

7

explicit interface implementationです。 (EDIT:署名のIDatatErrorInfo.一部は、明示的なインターフェイスの実装を意味し、.this[...]部分はインデクサを意味)

明示的IDataErrorInfoオブジェクトを入力した、あなたが取得することで、角括弧を使用したときにそれが呼び出されます/内の文字列を渡しながら、値を取得する例:。それは、明示的なインターフェイスの実装ですので、種類を正確IDataErrorInfoとしてを知られているとき、それだけアクセス可能になることを

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

注意を。あなたはそれがあなたのサブクラスとして型指定されている場合は、そのクラスには、それを公開していない限り、それにはアクセスできません。

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

私は私のポストではあまり明確ではなかった。私は、この[string propertyName] 'がどのように動作しているかを調べることにもっと興味がありました。私は今それを見ている:)私は暗黙的な対明示的なインターフェイスを理解しています。 – Rachel

+0

@Rachelああ、シグネチャのどの部分が明示的なインターフェイスの実装とインデクサを参照しているかを明確にするために私の答えを編集しました。編集:インデクサは本質的に配列スタイルの角括弧構文を実装させますが、単に 'int'以外の任意の型を使用させることができます。それらはプロパティ/メソッドのように振る舞い、overloading/overriding/new/virtual/abstract/etcに対して同じ規則に従います。 –

+1

ありがとうございます。私は、 "これは文字列propertyNameが"実際何を思いつくのか "*を意味するバリエーションを探すのに問題がありました。今はインデクサと呼ばれていることを知っているので、もっと簡単に材料を見つけることができます:) – Rachel