我一直在实现IDataErrorInfo接口,但实际上并不想知道这条线是什么意思以及它是如何工作的。
string IDataErrorInfo.this[string propertyName]
{
get { return this.GetValidationError(propertyName); }
}
如何.this[string propertyName]
工作,以及何时/如何调用此属性?
我一直在实现IDataErrorInfo接口,但实际上并不想知道这条线是什么意思以及它是如何工作的。
string IDataErrorInfo.this[string propertyName]
{
get { return this.GetValidationError(propertyName); }
}
如何.this[string propertyName]
工作,以及何时/如何调用此属性?
这是indexer的显式接口实现。(编辑:签名部分表示显式接口实现,部分表示索引器。)IDatatErrorInfo.
.this[...]
只要你有一个明确类型的IDataErrorInfo
对象并且你在它上面使用方括号来检索/获取一个值,同时传入一个字符串,它就会被调用。例如:
IDataErrorInfo myDataErrorInfo = GetErrorInfo();
string myPropertyError = myDataErrorInfo["SomePropertyName"];
请注意,由于它是一个显式接口实现,因此只有当类型被准确地称为IDataErrorInfo
. 如果您将其键入为子类,则除非该类公开它,否则它将无法访问:
MyDataErrorInfoImpl myDataErrorInfo = GetErrorInfo();
string myPropertyError = myDataErrorInfo["SomePropertyName"]; //compiler error!
this[key]
实际上是一个索引器,并且在某种程度上是属性和方法之间的交叉。它就像一个属性,因为您可以绑定到它,但与常规属性相反,它接收一个参数。
在幕后它被实现为一个方法 - get_Item(key)
,如果你想通过反射访问它,你需要使用Item
一个名称。例如:
typeof(MyClass).GetProperty("Item");
在实现时了解这一点也很重要INotifyPropertyChanged
,在这种情况下,"Item[]"
或者Binding.IndexerName
应该用作属性名称以更新 UI。