Реализация IDynamicObject игнорирует несколько вызовов свойств

StackOverflow https://stackoverflow.com/questions/292602

Вопрос

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

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

dynamic foo = new DynamicFoo();

foo.Name = "Joe";

foo.Name = "Fred";

Console.WriteLine(foo.Name);

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top