我正在试验接口的显式实现。这是用当前上下文中无效的方法去除intellisense。 使用/practical-applications-of-the-adaptive-interface-pattern-the-fluent-builder-context/作为参考。为了证明它们不可调用,我认为我可以使用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个测试
[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();
}
有人会善意解释这个的原因吗? 我想要这个功能的一个例子是证明我不能在TennisGame中添加两个以上的玩家。
dynamic o = TennisGame.BeginBuild().With("Player A").Versus("Player B");
o.Versus("Player C"); //Should fail. It does, but for another reason
答案 0 :(得分:7)
动态变量可以访问类方法,但不能访问显式实现的接口方法。
是的,这是正确的。 dynamic
可以访问可访问的常规成员(基于上下文等,通常表示“公共”)。但是,即使在常规C#中,调用显式接口实现的 only 方法是将对象强制转换为接口。动态的情况仍然如此。
隐式interfact实现也是常规类API的一部分,因此它们可以从外部(对于类型)可用于常规c#和dynamic
。
基本上:不,dynamic
不能也不会访问显式接口实现。
要么转换为接口,要么使用接口类型中的反射(而不是对象类型)。