Question

J'ai implémenté IDynamicObject en C # 4 et renvoyé une sous-classe MetaObject personnalisée qui effectue la répartition de la propriété simple get / setter dans un dictionnaire. Pas sorcier.

Si je fais cela:

dynamic foo = new DynamicFoo();

foo.Name = "Joe";

foo.Name = "Fred";

Console.WriteLine(foo.Name);

Ensuite, "Joe" est imprimé sur la console ... le deuxième appel du séparateur "Nom" n'est jamais appelé (il ne passe jamais du tout dans mon code de répartiteur personnalisé).

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

Était-ce utile?

La solution

Quel que soit le métaObjet que vous retournez de (Bind) SetMember sera mis en cache et réutilisé dans ce cas. Vous avez 2 sites dynamiques en train de faire des sets. Le premier appel mettra le résultat en cache dans un cache L2 que le deuxième site récupérera avant de vous demander de créer une nouvelle règle.

Donc, quel que soit le métaObjet que vous retournez, vous devez inclure un arbre d’expression qui mettra à jour la valeur. Par exemple, il devrait faire quelque chose comme:

retourne le nouveau MetaObject (     Expression.AssignProperty (this.Expression, value.Expression),     Restrictions.TypeRestriction (this.Expression, this.Value.GetType ());

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top