IDynamicObject実装は複数のプロパティ呼び出しを無視します
-
08-07-2019 - |
質問
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());
所属していません StackOverflow