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();
}

誰かがこの理由を説明するのに十分親切でしょうか? この機能が必要だった 1 つの例は、TennisGame に 3 人以上のプレーヤーを追加できないことを証明することでした。

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 に答える