質問

C#4でIDynamicObjectを実装しました。単純なプロパティgetter / setterをディクショナリにディスパッチするカスタムMetaObjectサブクラスを返します。ロケット科学ではありません。

これを行う場合:

dynamic foo = new DynamicFoo();

foo.Name = "Joe";

foo.Name = "Fred";

Console.WriteLine(foo.Name);

その後、「Joe」がコンソールに出力されます...「Name」セッターの2回目の呼び出しは呼び出されません(カスタムディスパッチャーコードにまったくステップインしません)。

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

役に立ちましたか?

解決

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

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

新しいMetaObject(     Expression.AssignProperty(this.Expression、value.Expression)、     Restrictions.TypeRestriction(this.Expression、this.Value.GetType());

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top