2009-05-31 14 views
20

Actualmente estoy investigando la segunda edición de C# en profundidad y tratando de implementar "búferes de protocolo dinámico", es decir, un nivel de soporte dinámico sobre mi biblioteca de búfer de protocolo existente. Como tal, tengo un tipo DlrMessage derivado de DynamicObject. Después de jugar un poco, he conseguido que responda a propiedades simples con un código notablemente pequeño, pero quiero ir mucho más allá y comprender realmente lo que está sucediendo.¿Cuál es la mejor fuente de información sobre DLR (.NET 4.0 beta 1)?

Hasta ahora no he encontrado ninguna buena explicación del DLR, y muchas de las publicaciones en el blog están actualmente desactualizadas, ya que las cosas han cambiado (creo) entre el CTP anterior y el beta de .NET 4.0 1 . El MSDN documentation for DynamicObject es bastante mínimo en este momento.

Mi consulta más inmediata es si hay una forma simple de decir: "Use el reflejo para enlazar cualquier llamada que no pueda manejar, utilizando este objeto en particular". (En otras palabras, quiero aumentar el enlace de reflejo existente en lugar de hacer todo yo mismo, si es posible.) Lamentablemente, no estoy muy lejos de adivinar.

¿Existen fuentes definitivas y definitivas de documentación que deba conocer? Soy consciente de que parte de escribir sobre una nueva tecnología es exploración, pero una mano de ayuda sería agradecida :)

+5

Mira y aquí pensé que te referías al Docklands Light Railway. :) – cletus

+10

Cerrando la broma de cletus como un duplicado: http://stackoverflow.com/questions/655194/how-does-the-dlr-work;) –

Respuesta

23

mejor fuente que he encontrado y leído con frecuencia es los últimos años el valor de los puestos de Chris Burrow en his blog .

También está el official DLR documentation page que está fuera del main DLR site.

+1

Ooh, que se ve muy útil, gracias - Me gusta especialmente el hecho de que es todo reciente :) La "introducción del autor de la biblioteca" parece que es * exactamente * lo correcto. –

+36

Bueno, esa era su pregunta. "... fuentes recientes de documentación ..." :) ¿Hay alguna insignia para que Jon Skeet acepte una respuesta? – TheSoftwareJedi

5

Yo también estoy investigando esto por el momento y no hay mucha información todavía. No puedo ayudarlo con su consulta, pero a continuación hay alguna información que he encontrado:

Hay una cantidad justa dentro de los videos de PDC.

http://channel9.msdn.com/pdc2008/TL44/

http://channel9.msdn.com/pdc2008/TL10/

Este artículo habla de cómo el DLR trabaja con IronPython: http://msdn.microsoft.com/en-us/magazine/cc163344.aspx

Hay una cantidad muy pequeña en la formación kit de vista previa en: http://www.microsoft.com/downloads/details.aspx?FamilyID=752cb725-969b-4732-a383-ed5740f02e93&displayLang=en

Esperanza esto ayuda

Alex

3

Por defecto DynamicObject dirá "repliegue a la reflexión" si sus funciones Try * devuelven falso. De modo que ya puede heredar y agregar propiedades/campos/métodos a su subclase, que se manejarán por reflexión si la ruta dinámica no realiza la búsqueda.

Yendo más en profundidad es posible que desee ver IDynamicMetaObjectProvider. En este nivel inferior, la forma en que dices "recurrir a la reflexión" es llamar al método Fallback * en el DynamicMetaObjetBinder entrante. Esto permite que el lenguaje de llamada proporcione la resolución. Luego puede devolver ese AST o componerlo en un AST más grande que regrese. Básicamente Fallback * le permite obtener el AST que produciría el lenguaje de llamada, incluido el error correcto (excepción, indefinido en JS, etc.).

La forma en que DynamicObject realiza la reflexión alternativa es que realmente llama al método Fallback * del encuadernador dos veces.La primera vez que retrocede sin un parámetro "errorSuggest". Esto obtiene el error o el AST que se construyó utilizando la reflexión. Se produce entonces un AST, que es algo así como:

if(TryGetMember("name", out value)) { 
    return value; 
} else { 
    return resultOffallback; 
} 

A continuación, toma esta AST combinado y de hecho lo entrega en la que la sugerencia de error para el aglutinante en una segunda reserva. El encuadernador debería entonces respetar este error. Sugerencia si el enlace no tiene éxito. Pero si el miembro .NET está presente, se descarta errorSuggest y el enlace .NET tiene prioridad. Y finalmente, si el idioma no sabe si el enlace fue exitoso (por ejemplo, el idioma tiene una característica de tipo "método faltante"), puede combinar los AST con sus controles dinámicos. Entonces, con Fallback no solo puede decir "hacer reflexión" sino que también puede elegir si los miembros dinámicos o estáticos tienen prioridad.

+1

Gracias. El problema con DynamicObject es que vuelve a la reflexión sobre * este * objeto. Me gustaría que volviera a la reflexión sobre un objeto * diferente *, y sospecho que para que eso funcione, tendría que implementar IDynamicMetaObjectProvider, que es más problemas de los que vale en este caso. Terminé copiando una carga de métodos en mi tipo dinámico, que solo representa el otro objeto, por lo que aún obtengo el beneficio de la reflexión. Feo, pero funciona. –

+1

@Jon Skeet Usted escribe un archivo T4 simple para codegen este patrón de adaptador para cualquier objeto con bastante facilidad dentro de una clase parcial. Si haces esa pregunta, ¡publicaré una solución para ti! – TheSoftwareJedi

Cuestiones relacionadas