implementação IDynamicObject ignora várias chamadas de propriedade
-
08-07-2019 - |
Pergunta
Eu tenho implementado IDynamicObject em C # 4, retornar uma subclasse MetaObject personalizado que faz simples propriedade getter / setter expedição para um dicionário. Não ciência do foguete.
Se eu fizer isso:
dynamic foo = new DynamicFoo();
foo.Name = "Joe";
foo.Name = "Fred";
Console.WriteLine(foo.Name);
Em seguida, 'Joe' é impresso para o console ... a segunda chamada para setter 'Nome' nunca é invocado (nunca pisa no meu código despachante costume em todos).
Eu sei que o DLR faz caching callsite, mas eu assumi que não se aplicaria aqui. Alguém sabe o que está acontecendo?
Solução
Whatever MetaObject você está retornando a partir de (Bind) SetMember serão armazenados em cache e re-utilizado neste caso. Você tem 2 sites dinâmicos fazendo sets. A chamada 1ª irá armazenar em cache o resultado em um cache L2 que o 2º site vai pegar antes de pedir-lhe para produzir uma nova regra.
Assim, qualquer metaobjeto você está retornando necessidades para incluir uma árvore de expressão que irá atualizar o valor. Por exemplo, ele deve fazer algo como:
retornar nova MetaObject ( Expression.AssignProperty (this.Expression, value.Expression), Restrictions.TypeRestriction (this.Expression, this.Value.GetType ());