2008-11-15 3 views
0

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

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

dynamic foo = new DynamicFoo(); 

foo.Name = "Joe"; 

foo.Name = "Fred"; 

Console.WriteLine(foo.Name); 

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

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

+0

может быть, потому что он все еще бета ??? – 2008-11-15 14:38:17

ответ

3

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

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

возвращения нового метаобъект ( Expression.AssignProperty (this.Expression, value.Expression), Restrictions.TypeRestriction (this.Expression, this.Value.GetType());