Pregunta

En C # 4.0 vamos a obtener tipos dinámicos u objetos cuyo "tipo estático es dinámico", según Anders. Esto permitirá que cualquier resolución de invocación de método ocurra en tiempo de ejecución en lugar de tiempo de compilación. Pero habrá la posibilidad de vincular el objeto dinámico a algún tipo de contrato (y, por lo tanto, también recuperar el intellisense completo), en lugar de permitir cualquier llamada incluso si sabe que no es probable que sea válido.

I.e. en lugar de solo

dynamic foo = GetSomeDynamicObject();

tiene la capacidad de lanzarlo o transformarlo para restringirlo a un contrato conocido, como

IFoo foo2 = foo.To<IFoo>;

o incluso solo

IFoo foo2 = foo as IFoo;

No se puede encontrar algo así en los materiales existentes para C # 4.0, pero parece una extensión lógica del paradigma dinámico. ¿Alguien con más información?

¿Fue útil?

Solución

No tengo conocimiento de nada que realmente se parezca a la escritura de patos, me temo. Tengo escribí en un blog sobre la idea , pero no espero ningún apoyo. Probablemente no sería demasiado difícil usar Reflection.Emit para crear una clase que genere una implementación de cualquier interfaz dada, tomando un objeto dinámico en el constructor y simplemente enviando cada llamada a él. No es ideal, pero podría ser un recurso provisional.

Otros consejos

Esa es una idea genial. Si te entiendo, estás describiendo / proponiendo una capacidad del CLR, por lo que, cuando intentas lanzar un objeto dinámico a una interfaz, debería ver qué métodos / propiedades admite el objeto dinámico y ver si tiene alguno implementar efectivamente esa interfaz. Luego, el CLR se encargaría de 'implementar IFoo' en el objeto, por lo que puede convertir el objeto dinámico en un IFoo. Es casi seguro que eso no será compatible, pero es una idea interesante.

Tobias Hertkorn respondió mi pregunta aquí con un enlace a su blogpost que muestra un ejemplo de cómo usar el método Convert () en MetaObject para devolver un proxy dinámico. Parece muy prometedor.

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