c# - una - Acceso a objetos dinámicos F#
tipos de datos dinamicos c# (3)
¿Hay alguna forma de acceder a los objetos DLR (por ejemplo, instancia de subclase DynamicObject) miembros (propiedades y métodos) en F # que es similar a C # dynamic?
Sí lo es. Puedes usar ?
operador en F #, y se realizará de la misma manera en el tipado dinámico en C # y VB.NET en .NET 4.0. Para empezar, puede leer este ejemplo Dynamic SQLDataReader del blog de Tomas Petricek:
http://tomasp.net/blog/dynamic-sql.aspx
Aquí hay una cita de su artículo:
En este artículo, veremos cómo usar el operador dinámico para mejorar dramáticamente la experiencia de usar ADO.NET desde F #. El operador dinámico (en realidad hay dos) es una forma simple de admitir la invocación dinámica en F #. Podemos usarlo para escribir código que se parece a una llamada de método ordinario o acceso a propiedades, pero se resuelve dinámicamente en tiempo de ejecución (usando el nombre del método o la propiedad). El siguiente ejemplo muestra lo que podremos escribir al final de este artículo:
// Call ''GetProducts'' procedure with ''CategoryID'' set to 1 use conn = new DynamicSqlConnection(connectionString) use cmd = conn?GetProducts cmd?CategoryID <- 1 conn.Open() // Read all products and print their names use reader = cmd.ExecuteReader() while reader.Read() do printfn "Product: %s" reader?ProductName
Si alguna vez intentó llamar a un procedimiento almacenado SQL directamente con SqlCommand, seguramente podrá apreciar la elegancia de este fragmento de código. Veamos ahora un ejemplo más amplio y algunos de los trucos que hacen que esto sea posible ...
Y para obtener más información, puede leer el resto de su artículo. Feliz codificación dinámica en F # :)
Ahora hay un módulo en nuget que usa el dlr para implementar el operador dinámico. FSharp.Interop.Dynamic
Tiene varias ventajas sobre muchos de los fragmentos que hay.
- Rendimiento que utiliza Dynamitey para la llamada dlr que implementa el almacenamiento en caché y es una biblioteca PCL
- Maneja los métodos que devuelven el vacío, obtendrá una excepción vinculante si no descarta los resultados de esos.
- El dlr maneja el caso de llamar a un delegado devuelto por una función automáticamente, esto también le permitirá hacer lo mismo con un FSharpFunc
Agrega un! operador de prefijo para manejar la invocación directa de objetos dinámicos y funciones que no tienen el tipo en tiempo de ejecución.
Es de código abierto, licencia de Apache, puede ver la implementación y los casos de ejemplo de prueba de unidad básica.
Como mencionó Eriawan, el ?
el operador se comporta un poco como el tipo dynamic
en C #. El artículo sobre llamar a SQL no depende de nada del DLR, ya que puede proporcionar su propia implementación del ?
operador y el compilador lo usa directamente.
También escribí un breve ejemplo de cómo usar el ?
operador para llamar a los miembros que usan DLR, que está disponible en F # snippets y hay una versión más sofisticada de Matthew Podwysocki . Otro fragmento muestra cómo usarlo para llamar a tipos .NET estándar usando Reflection .
Ver también: