C#4のIDynamicObjectインターフェイスをどのように実装しますか?
-
05-07-2019 - |
質問
C#4.0で&method; missing"セマンティクスなどを実装するには、IDynamicObjectを実装する必要があります。
public interface IDynamicObject
{
MetaObject GetMetaObject(Expression parameter);
}
IDynamicObjectは実際にはDLRの一部であることがわかる限り、新しいものではありません。しかし、私はそれに関する多くのドキュメントを見つけることができませんでした。
いくつかの非常に単純な実装例があります(fx こちらおよびこちら)、しかし、誰かがより完全な実装またはいくつかの実際のドキュメントを私に指すことができますか?
特に、「パラメータ」パラメータをどのくらい正確に処理することになっていますか?
解決
簡単な答えは、呼び出し元で実行されるコードを実際に生成するのはMetaObjectであるということです。これに使用するメカニズムはLINQ式ツリーであり、DLRで強化されています。そのため、オブジェクトで開始する代わりに、オブジェクトを表す式で開始し、最終的に、実行するアクションを記述する式ツリーを返す必要があります。
これで遊ぶときは、CTPのSystem.Coreのバージョンが8月末のスナップショットから取得されたことを思い出してください。 IronPythonの特定のベータ版とは完全には一致しません。それ以来、DLRに多くの変更が加えられました。
また、CLR v2 System.Coreとの互換性のために、ベータ4またはベータ5で始まるIronPythonのリリースでは、システム名前空間内のすべての名前がMicrosoft名前空間内にあるように変更されました。
他のヒント
ソースコードを含むエンドツーエンドのサンプルが必要な場合、任意のプロパティの値をディクショナリに格納する動的オブジェクトを作成し、私の投稿"最初のC#4.0のDuck Typingをご覧ください。が適切かもしれません。動的オブジェクトを静的に型指定されたインターフェイスにキャストする方法を示すために、この投稿を書きました。 IDynamicObjectであり、IQuackのように機能するDuckの完全に機能する実装を備えています。
詳細な情報が必要な場合は、ブログで私に連絡してください。できる限りお手伝いします。
ここでこれを行う方法についてブログに書きました:
http://mikehadlow.blogspot.com /2008/10/dynamic-dispatch-in-c-40.html
これまでに私が理解したことは次のとおりです。
動的言語ランタイムは現在、 IronPythonプロジェクトの一部として維持されています。情報を入手するには最適な場所です。
IDynamicObjectをサポートするクラスを実装する最も簡単な方法は、 Microsoft.Scripting.Actions.Dynamic を使用して、関連するメソッド(たとえば、関数呼び出しのセマンティクスを実装するCallメソッド)をオーバーライドします。 Microsoft.Scripting.Actions.DynamicはCTPに含まれていないように見えますが、IronPython 2.0のものは動作するようです。
" parameter"パラメーターの正確な意味はまだわかりませんが、動的オブジェクトのバインディングのコンテキストを提供しているようです。
このプレゼンテーションでは、DLRに関する多くの情報も提供しています。
- Deep Dive:Dynamic Languages in Microsoft .NET (ジムヒューグニン) >