0

IDynamicObject を C# 4 で実装し、Dictionary への単純なプロパティ getter/setter ディスパッチを行うカスタム MetaObject サブクラスを返します。ロケット科学ではありません。

私がこれを行う場合:

dynamic foo = new DynamicFoo();

foo.Name = "Joe";

foo.Name = "Fred";

Console.WriteLine(foo.Name);

次に、'Joe' がコンソールに出力されます...'Name' セッターへの 2 番目の呼び出しは呼び出されません (私のカスタム ディスパッチャー コードにステップ インすることはまったくありません)。

DLR がコールサイト キャッシングを行うことは知っていますが、ここでは当てはまらないと思いました。何が起こっているか知っている人はいますか?

4

1 に答える 1

3

この場合、(Bind)SetMember から返される MetaObject はすべてキャッシュされ、再利用されます。セットを行う 2 つの動的サイトがあります。最初の呼び出しは、結果を L2 キャッシュにキャッシュし、2 番目のサイトがそれを取得してから、新しいルールの作成を要求します。

したがって、返す MetaObject には、値を更新する式ツリーを含める必要があります。たとえば、次のようにする必要があります。

return new MetaObject( Expression.AssignProperty(this.Expression, value.Expression), Restrictions.TypeRestriction(this.Expression, this.Value.GetType());

于 2008-11-15T17:29:52.717 に答える