23

私は現在、C# の第 2 版を詳細に調査しており、「動的プロトコル バッファ」を実装しようとしています。つまり、既存のプロトコル バッファ ライブラリの上にあるレベルの動的サポートを実装しようとしています。そのため、DlrMessageから派生した型がありDynamicObjectます。少し遊んだ後、非常に少ないコードで単純なプロパティに応答するようになりましたが、さらに先に進み、何が起こっているのかを本当に理解したいと思っています。

これまでのところ、DLR の適切な説明は見つかりませんでした。また、以前の CTP と .NET 4.0 ベータ 1 の間で状況が変わった (と私は信じています) ため、多くのブログ投稿は事実上古くなっています。MSDN のドキュメントfor DynamicObjectは現時点では最小限です。

私の最も直接的な質問は、「この特定のオブジェクトを使用して、処理できない呼び出しをリフレクションを使用してバインドする」という簡単な方法があるかどうかです。(言い換えれば、可能であれば、自分ですべてを行うのではなく、既存のリフレクション バインディングを拡張したいと考えています。) 残念ながら、当て推量ではあまり進んでいません。

私が知っておくべき決定的で最近のドキュメントのソースはありますか? 新しいテクノロジーについて書くことの一部探索であることは承知していますが、助けていただければ幸いです :)

4

3 に答える 3

23

私が見つけて頻繁に読んでいる最良の情報源は、Chris Burrow の過去数年間の彼のブログの投稿です。

メインの DLR サイトから離れた公式の DLR ドキュメント ページもあります。

于 2009-05-31T17:52:19.470 に答える
5

私も現在調査中で、まだ情報があまりありません。あなたの質問にはお答えできませんが、以下は私が見つけた情報です。

PDC ビデオにはかなりの量があります。

http://channel9.msdn.com/pdc2008/TL44/

http://channel9.msdn.com/pdc2008/TL10/

この記事では、DLR が IronPython とどのように連携するかについて説明しています: http://msdn.microsoft.com/en-us/magazine/cc163344.aspx

次のトレーニング キット プレビューには、ごく少量が含まれています。

お役に立てれば

アレックス

于 2009-05-31T18:11:42.420 に答える
3

デフォルトでは、Try* 関数が false を返す場合、DynamicObject は「リフレクションにフォールバック」と言います。したがって、動的パスがルックアップを行わない場合、すべてリフレクションによって処理されるプロパティ/フィールド/メソッドを継承してサブクラスに追加できます。

IDynamicMetaObjectProvider を詳しく見てみるとよいでしょう。この下位レベルでは、リフレクションへのフォールバックと言う方法は、着信 DynamicMetaObjetBinder で Fallback* メソッドを呼び出すことです。これにより、呼び出し元の言語が解決策を提供できるようになります。その後、その AST を返すか、それをより大きな AST に構成して返すことができます。基本的に Fallback* を使用すると、正しいエラー (例外、JS で未定義など) を含む、呼び出し元の言語が生成する AST を取得できます。

DynamicObject がリフレクションにフォールバックする方法は、バインダーの Fallback* メソッドを実際に 2 回呼び出すことです。「errorSuggestion」パラメーターなしで初めてフォールバックする。これは、リフレクションを使用して構築されたエラーまたは AST のいずれかを取得します。次に、次のような AST を生成します。

if(TryGetMember("name", out value)) {
   return value;
} else {
   return resultOffallback;
}

次に、この結合された AST を取得し、2 回目のフォールバックでバインダーのエラー提案として実際に渡します。バインドが失敗した場合、バインダーはこの errorSuggestion を尊重する必要があります。ただし、.NET メンバーが存在する場合、errorSuggestion は破棄され、.NET バインディングが優先されます。最後に、バインドが成功したかどうかを言語が認識できない場合 (たとえば、言語に「メソッドが見つからない」タイプの機能がある場合)、動的チェックで AST を再び組み合わせることができます。したがって、フォールバックを使用すると、リフレクションを行うと言うだけでなく、動的メンバーと静的メンバーのどちらを優先するかを選択することもできます。

于 2009-05-31T23:40:12.593 に答える