将显式接口实现与动态对象一起使用

我正在试验接口的显式实现。 这是用当前上下文中无效的方法去除intellisense。 使用/ practical-applications-of-adaptive-application-of-fluent-builder-context /作为参考。 为了certificate它们不可调用,我想我可以使用dynamic关键字,因为至少我的代码会编译。 它确实编译,但它没有按预期工作。 动态变量可以访问类方法,但不能访问显式实现的接口方法。

public interface IAmInterface { void Explicit(); void Implicit(); } public class Implementation : IAmInterface { void IAmInterface.Explicit() { } public void Implicit() { } public static Implementation BeginBuild() { return new Implementation(); } } 

以下是3个测试来certificate我的观点

 [Test] public void TestWorksAsExpected() //Pass { var o = Implementation.BeginBuild(); o.Implicit(); } [Test] public void TestDoesNotWorkWithExplicitImplementation() //Fails { dynamic o = Implementation.BeginBuild(); o.Explicit(); } [Test] public void ButWorksForImplicitImplementation() //Pass { dynamic o = Implementation.BeginBuild(); o.Implicit(); } 

有人会善意解释这个的原因吗? 我想要这个function的一个例子是certificate我不能在TennisGame中添加两个以上的玩家。

 dynamic o = TennisGame.BeginBuild().With("Player A").Versus("Player B"); o.Versus("Player C"); //Should fail. It does, but for another reason 

动态变量可以访问类方法,但不能访问显式实现的接口方法。

对,那是正确的。 dynamic可以访问可访问的常规成员(基于上下文等,通常表示“公共”)。 但是,即使在常规C#中,调用显式接口实现的唯一方法是将对象强制转换为接口。 这仍然是动态的情况。

隐式interfact实现也是常规类API的一部分,因此它们对于常规c#和dynamic都是外部可用的(针对类型)。

基本上:不, dynamic不能也不会访问显式接口实现。

要么转换为接口,要么使用接口类型的reflection(不是对象类型)。