有没有办法在F#中访问类似于C#dynamic的DLR对象(例如DynamicObject子类实例)成员(属性和方法)?F#动态对象访问
F#动态对象访问
回答
现在有上的NuGet一个模块,使用DLR来实现动态操作。 FSharp.Interop.Dynamic
它比很多外部片段有几个优点。
- 性能,它使用Dynamitey为DLR调用它实现缓存,是一个PCL库
- 句柄返回void方法,你如果不抛弃这些结果得到的结合异常。
- dlr处理通过函数自动调用委托返回的情况,这也将允许您对FSharpFunc执行相同操作
添加!前缀运算符来处理直接调用在运行时没有类型的动态对象和函数。
它的开源,Apache许可证,你可以看看implementation和基本单元测试example cases。
是的。您可以在F#中使用?
运算符,并且它将在.NET 4.0中的C#和VB.NET中的动态类型中执行相同的操作。一开始,你可以从托马斯Petricek的博客阅读本样本动态SqlDataReader的:
http://tomasp.net/blog/dynamic-sql.aspx
下面是从他的文章报价:
在这篇文章中,我们将介绍如何使用 动态运算符使得使用来自F# 的ADO.NET的体验显着更好。动态运算符 (实际上其中有两个)是 支持在F#中调用动态 的简单方法。我们可以用它来编写 代码,该代码几乎看起来像一个 普通方法调用或属性 访问,但在运行时(使用方法 或属性的名称)动态解析。下面的例子 显示了我们就可以在 这篇文章的结尾这样写:
// 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
如果你曾经试图打电话直接使用 的SqlCommand SQL存储过程 ,那么你一定能 欣赏此代码的优雅 代码片段。现在让我们来看看一个 更大的示例和一些整洁 技巧,使这成为可能的...
而对于更多的信息,你可以阅读他的文章的其余部分。 F#中的快乐动态编码:)
正如eriawan提到的那样,?
运算符的行为有点像C#中的dynamic
类型。有关调用SQL的文章并不依赖DLR中的任何内容,因为您可以提供自己的?
运算符实现,并且编译器直接使用它。
我还写了一个简单的例子,说明如何使用?
运算符来调用使用DLR的成员,它是available on F# snippets,还有一个更多sophisticated version by Matthew Podwysocki。另一个片段显示如何使用它来调用标准.NET types using Reflection。
参见:
- 1. 访问JavaScript对象动态
- 2. 访问F中的动态属性#
- 3. 动态访问JSON对象没有键
- 4. 如何访问与动态proprierties对象
- 5. djangoproject动态访问对象的字段
- 6. 访问动态对象属性
- 7. 如何动态访问对象属性?
- 8. 动态访问对象属性
- 9. 动态访问嵌套对象
- 10. 动态访问java对象变量
- 11. Angularjs动态访问范围对象
- 12. 访问动态命名的JavaScript对象?
- 13. grails动态访问域对象
- 14. Newtonsoft.Json - 动态对象属性访问
- 15. 访问对象动态与适配器
- 16. PHP如何动态访问对象?
- 17. 访问动态对象:javascript/jquery
- 18. 动态访问功能对象属性
- 19. 从Scala对象动态访问方法
- 20. 访问动态创建的对象C++
- 21. JQuery访问动态创建的对象
- 22. F#静态成员访问
- 23. 使用动态对象名称访问对象
- 24. 访问对象是浮动对象
- 25. 访问对象
- 26. 访问对象
- 27. 访问对象/
- 28. 访问对象#
- 29. 访问对象
- 30. Silverlight访问ASPX静态对象
tnx。奇怪谷歌怎么没有出现在F#dlr/dynamic dispatch上的链接:\ 我的google-fu吸收 – 2011-05-27 09:25:57
不客气。你是对的,它没有出现在谷歌查询中。 – 2011-05-27 09:27:57
其实?在F#中几乎与C#中的动态相同,而Tomas的存储过程示例不使用DLR。见托马斯的答案和其他相关问题。 – 2011-05-27 13:34:39