Pregunta

Para implementar " falta el método " -semantics y similares en C # 4.0, tienes que implementar IDynamicObject:

public interface IDynamicObject
{
  MetaObject GetMetaObject(Expression parameter);
}

Hasta donde puedo entender, IDynamicObject es en realidad parte del DLR, por lo que no es nuevo. Pero no he podido encontrar mucha documentación al respecto.

Hay algunas implementaciones de ejemplo muy simples (fx here y aquí ), pero ¿podría alguien indicarme implementaciones más completas o alguna documentación real?

Especialmente, ¿cómo se supone que debes manejar el " parámetro " -parameter?

¿Fue útil?

Solución

La respuesta corta es que el MetaObject es el responsable de generar realmente el código que se ejecutará en el sitio de la llamada. El mecanismo que utiliza para esto son los árboles de expresión LINQ, que se han mejorado en el DLR. Entonces, en lugar de comenzar con un objeto, comienza con una expresión que representa al objeto y, en última instancia, tendrá que devolver un árbol de expresiones que describa la acción a realizar.

Cuando juegues con esto, recuerda que la versión de System.Core en el CTP se tomó de una instantánea a fines de agosto. No se corresponde muy limpiamente con ninguna beta en particular de IronPython. Se han realizado una serie de cambios en el DLR desde entonces.

También, por compatibilidad con el CLR v2 System.Core, las versiones de IronPython que comienzan con beta 4 o beta 5 ahora renombran todo lo que hay en el espacio de nombres del Sistema para que esté en el espacio de nombres de Microsoft.

Otros consejos

Si desea una muestra de extremo a extremo, incluido el código fuente, que da como resultado un objeto dinámico que almacena el valor de las propiedades arbitrarias en un Diccionario, entonces mi publicación " Una primera mire Duck Typing en C # 4.0 " podría ser lo adecuado para usted. Escribí esa publicación para mostrar cómo se puede convertir un objeto dinámico en interfaces tipificadas estáticamente. Tiene una implementación de trabajo completa de un pato que es un objeto IDynamicObject y puede actuar como un IQuack.

Si necesitas más información, contáctame en mi blog y te ayudaré, tan bien como pueda.

Acabo de publicar un blog sobre cómo hacer esto aquí:

http://mikehadlow.blogspot.com /2008/10/dynamic-dispatch-in-c-40.html

Esto es lo que he descubierto hasta ahora:

El Dynamic Language Runtime se mantiene actualmente como parte del proyecto IronPython . Así que ese es el mejor lugar para obtener información.

La forma más fácil de implementar una clase compatible con IDynamicObject parece ser derivar de Microsoft.Scripting.Actions.Dynamic y reemplaza los métodos relevantes, por ejemplo, el método Call para implementar la función de la semántica de llamadas. Parece que Microsoft.Scripting.Actions.Dynamic no se ha incluido en el CTP, pero el de IronPython 2.0 parece que funcionará.

Todavía no estoy claro el significado exacto del parámetro " parámetro " -, pero parece proporcionar un contexto para el enlace del objeto dinámico.

Esta presentación también proporciona mucha información sobre el DLR:

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