L'implementazione di IDynamicObject ignora più invocazioni di proprietà
-
08-07-2019 - |
Domanda
Ho implementato IDynamicObject in C # 4, restituendo una sottoclasse MetaObject personalizzata che esegue l'invio semplice di getter / setter di proprietà in un dizionario. Non scienza missilistica.
Se lo faccio:
dynamic foo = new DynamicFoo();
foo.Name = "Joe";
foo.Name = "Fred";
Console.WriteLine(foo.Name);
Quindi 'Joe' viene stampato sulla console ... la seconda chiamata al setter 'Name' non viene mai invocata (non entra mai nel mio codice dispatcher personalizzato).
So che il DLR esegue la memorizzazione nella cache del sito, ma ho pensato che non sarebbe applicabile qui. Qualcuno sa cosa sta succedendo?
Soluzione
Qualunque MetaObject da cui stai tornando (Bind) SetMember verrà memorizzato nella cache e riutilizzato in questo caso. Hai 2 siti dinamici che fanno set. La prima chiamata memorizzerà nella cache il risultato in una cache L2 che il secondo sito raccoglierà prima di chiederti di produrre una nuova regola.
Quindi qualunque MetaObject che stai restituendo deve includere un albero di espressioni che aggiornerà il valore. Ad esempio, dovrebbe fare qualcosa del tipo:
restituisce nuovo MetaObject ( Expression.AssignProperty (this.Expression, value.Expression), Rest restrizioni.TypeRestriction (this.Expression, this.Value.GetType ());