3

我正在试验接口的显式实现。这是用在当前上下文中无效的方法来剥离智能感知。使用/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
4

1 回答 1

7

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

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

隐式交互实现也是常规类 API 的一部分,因此它们对于常规 c# 和dynamic.

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

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

于 2012-07-24T07:45:53.427 回答