2008-11-15 4 views
0

J'ai implémenté IDynamicObject dans C# 4, renvoyer une sous-classe MetaObject personnalisée qui effectue une répartition getter/setter de propriété simple vers un dictionnaire. Pas de science de fusée.L'implémentation IDynamicObject ignore les multiples invocations de propriétés

Si je fais ceci:

dynamic foo = new DynamicFoo(); 

foo.Name = "Joe"; 

foo.Name = "Fred"; 

Console.WriteLine(foo.Name); 

Then « Joe » est imprimé à la console ... le deuxième appel au setter « Nom » est jamais appelé (jamais pas dans mon code de répartiteur personnalisé tout).

Je sais que le DLR fait la mise en cache des sites d'appel, mais j'ai supposé que cela ne s'appliquerait pas ici. Quelqu'un sait ce qu'il se passe?

+0

peut-être parce que c'est encore bêta ??? –

Répondre

3

Quel que soit le MétaObject dans lequel vous revenez (Bind), SetMember sera mis en cache et réutilisé dans ce cas. Vous avez 2 sites dynamiques faisant des ensembles. Le 1er appel mettra en cache le résultat dans un cache L2 que le 2ème site récupérera avant de vous demander de produire une nouvelle règle. Donc, quel que soit MetaObject, vous devez inclure un arbre d'expression qui mettra à jour la valeur. Par exemple, il doit faire quelque chose comme:

retour nouvelle méta-objet ( Expression.AssignProperty (this.Expression, value.Expression), Restrictions.TypeRestriction (this.Expression, this.Value.GetType());

Questions connexes