¿Cómo se implementa la interfaz IDynamicObject de C#4?
c#-4.0 dynamic-language-runtime (5)
Para implementar la semántica "faltante de método" y tal en C # 4.0, debe implementar IDynamicObject:
public interface IDynamicObject
{
MetaObject GetMetaObject(Expression parameter);
}
Por lo que puedo deducir, IDynamicObject es en realidad parte del DLR, por lo que no es nuevo. Pero no he podido encontrar mucha documentación sobre esto.
Hay algunas implementaciones de ejemplos muy simples (fx aquí 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 "parámetro"?
Esta presentación también proporciona mucha información sobre el DLR:
- Deep Dive: Dynamic Languages en Microsoft .NET por Jim Hugunin.
Esto es lo que he descubierto hasta ahora:
Dynamic Language Runtime se mantiene actualmente como parte del proyecto IronPython . Entonces ese es el mejor lugar para buscar información.
La forma más sencilla de implementar una clase que admita IDynamicObject parece ser derivar de Microsoft.Scripting.Actions.Dynamic y anular los métodos relevantes, por ejemplo, el método de llamada para implementar la semántica de llamadas de función. 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 tengo claro el significado exacto del parámetro "parámetro", pero parece proporcionar un contexto para la vinculación del objeto dinámico.
La respuesta corta es que MetaObject es el responsable de generar realmente el código que se ejecutará en el sitio de llamadas. El mecanismo que utiliza para esto son los árboles de expresión LINQ, que se han mejorado en el DLR. Por lo tanto, en lugar de comenzar con un objeto, comienza con una expresión que representa el objeto y, en última instancia, tendrá que devolver un árbol de expresiones que describa la acción que se realizará.
Al jugar con esto, recuerde que la versión de System.Core en el CTP se tomó de una instantánea a finales de agosto. No se corresponde muy claramente con ninguna beta particular de IronPython. Se han realizado una serie de cambios en el DLR desde entonces.
Además, para compatibilidad con CLR v2 System.Core, las versiones de IronPython que comienzan con beta 4 o beta 5 ahora cambian el nombre de todo lo que está en el espacio de nombres del sistema para estar en el espacio de nombres de Microsoft.
Acabo de escribir en un blog acerca de cómo hacer esto aquí:
http://mikehadlow.blogspot.com/2008/10/dynamic-dispatch-in-c-40.html
Si desea una muestra de extremo a extremo que incluya código fuente, lo que da como resultado un objeto dinámico que almacena valor para propiedades arbitrarias en un diccionario, entonces mi publicación "Una primera mirada a Duck Typing en C # 4.0" podría ser adecuada para usted. Escribí esa publicación para mostrar cómo se puede convertir el objeto dinámico en interfaces tipadas estáticamente. Tiene una implementación de trabajo completa de un pato que es un IDynamicObject y puede actuar como un IQuack.
Si necesita más información, contácteme en mi blog y lo ayudaré en todo lo que pueda.