Pregunta

He implementado IDynamicObject en C # 4, devuelvo una subclase de MetaObject personalizada que hace un despacho simple de getter / setter de propiedad a un Diccionario. No es ciencia espacial.

Si hago esto:

dynamic foo = new DynamicFoo();

foo.Name = "Joe";

foo.Name = "Fred";

Console.WriteLine(foo.Name);

Luego, 'Joe' se imprime en la consola ... la segunda llamada al configurador de 'Nombre' nunca se invoca (nunca entra en mi código de despachador personalizado).

Sé que el DLR realiza el almacenamiento en caché del sitio de llamadas, pero supuse que eso no se aplicaría aquí. Alguien sabe lo que está pasando?

¿Fue útil?

Solución

Cualquiera que sea el MetaObject del que regreses (Bind) SetMember se almacenará en caché y se reutilizará en este caso. Tienes 2 sitios dinámicos que hacen conjuntos. La primera llamada almacenará en caché el resultado en un caché L2 que el segundo sitio recogerá antes de pedirle que produzca una nueva regla.

Entonces, cualquier MetaObject que devuelva debe incluir un árbol de expresión que actualizará el valor. Por ejemplo, debería hacer algo como:

devolver nuevo MetaObject (     Expression.AssignProperty (this.Expression, value.Expression),     Restrictions.TypeRestriction (this.Expression, this.Value.GetType ());

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top