问题标签 [explicit-interface]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
12888 浏览

c# - 如何使用反射来获取显式实现接口的属性?

更具体地说,如果我有:

如何使用反射来获取显式实现 TempInterface 的属性的所有 propertyInfos?

谢谢。

0 投票
3 回答
2887 浏览

c# - 为什么要使用显式接口实现来调用受保护的方法?

codeplex中浏览 ASP.NET MVC 源代码时,我发现有一个类显式实现接口是很常见的。显式实现的方法/属性然后调用另一个具有相同名称的“受保护的虚拟”方法/属性。

例如,

我现在确定这种编程有什么好处。对我来说,我更喜欢只隐式实现接口 IHttpHandler。

我猜作者只是不希望MvcHandler有一个公共属性IsResuable。属性IsReusable只能在MvcHandler的实例被视为IHttpHandler时使用。不过,我不确定作者为什么会这样。

有人知道这种接口实现方式的更多好处吗?

0 投票
3 回答
731 浏览

.net - 显式实现接口时装箱的成本有多大

当前显式成员实现的指导方针建议:

  • 使用显式成员来近似私有接口实现。如果您仅出于基础设施的原因需要实现一个接口,并且您从不期望开发人员直接从该类型调用该接口上的方法,那么显式地实现成员以“隐藏”它们对公共视图
  • 公开一种替代方法来访问允许子类覆盖的任何显式实现的成员。

一个很好的例子是当您想要实现IXmlSerializable接口时。ReadXmlWriteXml方法应由 XmlSerializer 调用,通常不由开发人员直接调用。

当提供另一种方法来访问您希望允许被覆盖的显式成员时,调用显式实现的成员以避免代码重复似乎是有意义的。考虑以下:

我的问题是关于此实现中WriteXml方法的装箱有多昂贵。((IXmlSerializable)this).WriteXml(writer)会显着影响性能吗?

0 投票
1 回答
848 浏览

.net - LinkedList(T) 添加方法

ICollection(T)接口的 Add-method已由LinkedList(T)-类显式实现。这个集合反而有 AddFirst- 和 AddLast- 方法(等等)。显式实现的方法映射到 AddLast 方法。这有一些缺点,恕我直言,根本没有好处。两个主要缺点是:

  1. 您不能在 LinkedList(T) 上使用集合初始化,因为它需要添加方法。
  2. 如果您在方法中使用了一个 List(T) 并希望将其更改为使用 LinkedList(T) ,则必须将所有对 Add 的调用更新为调用 AddLast 。

我的想法是,你永远不应该显式地实现接口成员,除非当你知道具体类型时它们根本没有意义。例如,如果您正在实施只读 ICollection(T),则应显式实施(并有效隐藏) Add-method。

是否还有其他不应该在框架中明确实现的方法示例?

附带说明:要解决第二个问题,您可以为 LinkedList(T) 类创建一个扩展方法“Add”。

0 投票
4 回答
678 浏览

c# - 可以在显式接口实现中引用同名的隐式属性吗?

假设我有一个实现字符串类型属性的类型:

然后我有一个定义同名属性的接口:

我可以使用如下显式接口:

但是,如果我希望能够在我的显式接口中引用字符串“Value”,我可以这样做吗?如果是这样,怎么做?我想它是这样的:

如您所见,我想要“int valued”“Value”属性中的表达式的“string valued”“Value”属性。如果它是另一个显式实现的接口成员,我可以类型转换为该接口然后使用,但它如何用于隐式类型成员?

注意:这个例子有点做作,但希望能演示语言问题。

0 投票
3 回答
5929 浏览

c++-cli - C++/CLI:实现 IList 和 IList(默认索引器的显式实现)

我正在尝试实现一个同时实现IList和的 C++/CLI 类IList<T>

由于它们有重叠的名称,我必须显式地实现其中一个,自然选择应该是 IList。

索引器的隐式实现是:

我现在正在尝试为 IList 声明默认索引器。

我的猜测是这样的:

但这只是给了我

错误 C2061:语法错误:标识符“默认”

有什么提示吗?

0 投票
2 回答
3560 浏览

c# - 为什么是哈希集.IsReadOnly 是显式的吗?

不编译。我要做

为什么 IsReadOnly 没有正常实施?

(我不是问如何,而是为什么

0 投票
3 回答
4273 浏览

powershell - 如何从 PowerShell 调用显式实现的接口方法?

代码:

错误:

方法调用失败,因为 [Bar] 不包含名为“Foo”的方法。

0 投票
2 回答
14713 浏览

c# - C#中接口成员的访问修饰符

我从以下属性中收到编译错误。
错误是:

“修饰符‘public’对此项目无效”

但是如果我删除它,IWorkItemControl它编译得很好。

为什么会出现此错误,在签名中有/没有接口名称有什么区别?

0 投票
1 回答
306 浏览

c# - 使用显式接口防止意外修改 C# 中的属性

我偶然发现了一个我以前没有注意到的 C# 方法解析功能。也就是说,当我显式实现一个支持 setter 的接口,而隐式接口只提供一个受保护的集合时,编译器在我调用它时会明智地遵循受保护的集合。因此,我获得了自动实现属性的大部分便利,但我可以防止不应该更改字段的客户意外修改字段。

举个例子,

然后我的模型绑定代码不会意外设置日期,但我的 ORM 事件侦听器可以检查实现 IHaveUpdateDateFields 的实体并在持久化我的实体时设置日期。

我的问题是:

  1. 我是依赖于定义的行为,还是我保证所有 C# 编译器都会以这种方式解析方法?例如,我不想发现 C# 标准说这种方法解析是未定义的,然后在我为 Mono 构建时意外地发生了可怕的堆栈溢出。
  2. 有没有更好(理想情况下更简洁)的方法来做到这一点?我可以将 ModelBinder 安全接口传递给我的控制器,但这似乎不会为我节省代码,而且我认为它不会提供一种透明的方法来最大限度地减少意外修改属性。