2008-10-29 8 views
6

Para implementar -semantics "método-desaparecidos" y por ejemplo en C# 4.0, usted tiene que poner en práctica IDynamicObject:¿Cómo se implementa la interfaz IDynamicObject de C# 4?

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

Por lo que yo puedo entender IDynamicObject es en realidad parte de la DLR, por lo que no es nuevo . Pero no he podido encontrar mucha documentación sobre esto.

Existen algunas implementaciones de ejemplos muy simples (f.x. here y here), pero ¿podría alguien indicarme implementaciones más completas o alguna documentación real?

Especialmente, ¿cómo se supone que debe manejar exactamente el parámetro "parámetro"?

Respuesta

4

La respuesta corta es que 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. 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 corresponde muy claramente a ninguna beta particular de IronPython. Se han realizado una serie de cambios en el DLR desde entonces.

Además, por 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.

0

Aquí es lo que he descubierto hasta ahora:

El Dynamic Language Runtime se mantiene actualmente como parte de la IronPython project. Entonces ese es el mejor lugar para buscar información.

La forma más fácil de implementar una clase que admita IDynamicObject parece 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 estoy seguro del significado exacto del parámetro "parámetro", pero parece proporcionar un contexto para el enlace del objeto dinámico.

3

Si desea un extremo a otro de la muestra incluyendo código fuente, lo que resulta en un objeto dinámico que almacena el valor de las propiedades arbitrarias en un diccionario a continuación, my post "A first look at Duck Typing in C# 4.0" podría ser adecuado 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é con usted lo mejor que pueda.

Cuestiones relacionadas