c# - español - ¿Cuál es la mejor fuente de información sobre DLR(.NET 4.0 beta 1)?
static dynamic c# (3)
La mejor fuente que he encontrado y leído con frecuencia es el valor de los últimos años de las publicaciones de Chris Burrow en su blog .
También está la página oficial de documentación de DLR que está fuera del sitio principal de DLR .
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 de 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.
Hasta el momento no he encontrado ninguna buena explicación del DLR, y muchas de las publicaciones del blog están actualmente desactualizadas, ya que las cosas han cambiado (creo) entre el CTP anterior y .NET 4.0 beta 1. La documentación de MSDN para DynamicObject es bastante mínimo en este momento.
Mi consulta más inmediata es si hay una manera simple de decir: "Usar reflejo para enlazar cualquier llamada que no pueda manejar, usando 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.
¿Hay alguna fuente definitiva y definitiva de documentación que deba conocer? Soy consciente de que parte de escribir sobre una nueva tecnología es explorar, pero una mano amiga sería apreciada :)
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.
Para profundizar más, le recomendamos que consulte 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 a la reflexión es que en realidad 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. Luego produce un AST que es algo así como:
if(TryGetMember("name", out value)) {
return value;
} else {
return resultOffallback;
}
Luego toma este AST combinado y lo entrega como la sugerencia de error para el encuadernador en una segunda alternativa. 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 la vinculación fue exitosa (p. Ej., El lenguaje tiene una característica de tipo "método faltante"), puede combinar nuevamente los AST con sus comprobaciones dinámicas. 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.
Yo también estoy investigando esto en este momento y todavía no hay demasiada información. No puedo ayudarlo con su consulta, pero a continuación encontrará 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 sobre cómo el DLR funciona con IronPython: http://msdn.microsoft.com/en-us/magazine/cc163344.aspx
Hay una cantidad muy pequeña en la vista previa del kit de capacitación en: http://www.microsoft.com/downloads/details.aspx?FamilyID=752cb725-969b-4732-a383-ed5740f02e93&displayLang=en
Espero que esto ayude
Alex