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?

È stato utile?

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 ());

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top