Реализация IDynamicObject игнорирует несколько вызовов свойств - PullRequest
0 голосов
/ 15 ноября 2008

Я реализовал IDynamicObject в C # 4, возвращаю пользовательский подкласс MetaObject, который выполняет простую диспетчеризацию свойства getter / setter в Dictionary. Не ракетостроение.

Если я сделаю это:

dynamic foo = new DynamicFoo();

foo.Name = "Joe";

foo.Name = "Fred";

Console.WriteLine(foo.Name);

Затем «Джо» выводится на консоль… Второй вызов установщика «Имя» никогда не вызывается (никогда не входит в мой пользовательский код диспетчера).

Я знаю, что DLR выполняет кэширование на месте вызова, но я предположил, что это не будет применяться здесь. Кто-нибудь знает, что происходит?

1 Ответ

3 голосов
/ 15 ноября 2008

Независимо от того, какой MetaObject вы возвращаете из (Bind), SetMember будет кэшироваться и повторно использоваться в этом случае. У вас есть 2 динамических сайта, которые делают наборы. Первый вызов кеширует результат в кэш-памяти второго уровня, который будет захвачен вторым сайтом, прежде чем попросить вас создать новое правило.

Так что любой возвращаемый MetaObject должен содержать дерево выражений, которое будет обновлять значение. Например, он должен сделать что-то вроде:

вернуть новый MetaObject ( Expression.AssignProperty (this.Expression, value.Expression), Restrictions.TypeRestriction (this.Expression, this.Value.GetType ());

...