2

これが私のコードです:

public static class DynamicExtensions

    public static void Add(this ExpandoObject obj, string path){
        dynamic _obj = obj;
        if (_obj == null) throw new ArgumentNullException("obj");
        _obj.path = path;
    }
}

しかし、この方法で呼び出すと、「'System.Dynamic.ExpandoObject' には 'Add' の定義が含まれていません」というエラーが表示されました。

dynamic obj = new ExpandoObject();
obj.Add("p1");

修正方法は?

前もって感謝します!

4

2 に答える 2

12

問題はdynamic、拡張メソッドを使用することです.2つは一緒に機能しません. これは問題ありません:

ExpandoObject obj = new ExpandoObject();
obj.Add("p1");

...しかし、だけdynamicでは、拡張メソッドのサポートはありません。

C# 5 仕様のセクション 7.6.5.2 から:

いずれかのフォームのメソッド呼び出し (§7.5.5.1) で

expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )

呼び出しの通常の処理で適用可能なメソッドが見つからない場合、構成を拡張メソッドの呼び出しとして処理しようとします。expr または引数のいずれかにコンパイル時の型が動的である場合、拡張メソッドは適用されません。

コンパイラーは、拡張メソッドを適用するためにチェックする必要があるディレクティブを記憶できますが、覚えてusingいないだけです。おそらく、パフォーマンス上の理由か、比較的少ないメリットに対して多くの作業が必要であると感じられたためです。

于 2012-09-19T19:47:45.010 に答える
5

Dynamic は拡張メソッドを明示的に除外します。これは、メソッドがコンパイル時ではなく実行時に解決されるためです。メソッド呼び出しを正しく解決するには、どの using ディレクティブが有効かを含む呼び出しに関する情報が DLR に必要です。それを行うメカニズムはありません。詳細については、Eric Lippert によるこの回答を参照してください: https://stackoverflow.com/a/5313149/385844

もちろん、静的メソッド呼び出し構文を使用してメソッドを呼び出すことができます。

DynamicExtensions.Add(obj, "p1");
于 2012-09-19T19:47:58.383 に答える