【问题标题】:How does IDataErrorInfo.this[string propertyName] work in C#?IDataErrorInfo.this[string propertyName] 如何在 C# 中工作?
【发布时间】:2013-06-21 13:27:40
【问题描述】:

我一直在实现IDataErrorInfo 接口,并不真正想知道这行是什么意思以及它是如何工作的。

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

.this[string propertyName] 是如何工作的,何时/如何调用此属性?

【问题讨论】:

  • 认为这是indexerexplicit interface implementation,只要你有一个明确键入的IDataErrorInfo对象,它就会被调用:string myPropertyError = myDataErrorInfo["SomePropertyName"];
  • 是的,它只是显式的接口实现。你一般都知道吗? (如果没有,请查一下。)
  • @JonSkeet 我对显式实现接口的含义有一个粗略的了解(我在 Programmers.SE 上的asked 关于那段时间),但.this[string propertyName] 是我的主要部分不太明白。

标签: c# wpf idataerrorinfo


【解决方案1】:

这是explicit interface implementation 中的indexer。 (编辑:签名的IDatatErrorInfo. 部分表示显式接口实现,.this[...] 部分表示索引器。)

只要你有一个明确输入的IDataErrorInfo 对象并且你在它上面使用方括号来检索/获取一个值,同时传入一个字符串,它就会被调用。例如:

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

请注意,由于它是一个显式接口实现,因此只有当类型准确IDataErrorInfo 时才能访问它。如果您将其键入为子类,则除非该类公开它,否则它将无法访问:

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

【讨论】:

  • 对不起,我的帖子不是很清楚。我更感兴趣的是找出.this[string propertyName] 的工作原理,你提到的它是一个索引器。我现在正在查找 :) 我确实了解隐式与显式接口。
  • @Rachel Ahh,我已经编辑了我的答案,以明确签名的哪一部分是指显式接口实现和索引器。编辑:索引器本质上允许您实现数组样式的方括号语法,但允许您使用除int 之外的任何类型。它们的行为就像属性/方法一样,并遵循相同的重载/覆盖/新/虚拟/抽象/等规则。
  • 谢谢。我在谷歌上搜索 "what does .this[string propertyName] mean" 的变体时遇到了麻烦,无法得出它的实际含义。现在我知道它被称为索引器,我可以更轻松地找到有关它的材料:)
【解决方案2】:

this[key] 实际上是一个索引器,并且在某种程度上是属性和方法之间的交叉。它就像一个属性,因为您可以绑定到它,但与常规属性相反,它接收一个参数。

在幕后它被实现为一个方法 - get_Item(key),如果你想通过反射访问它,你需要使用 Item 作为名称。例如:

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

在实现INotifyPropertyChanged 时了解这一点也很重要,在这种情况下,"Item[]"Binding.IndexerName 应用作属性名称以更新 UI。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多