2011-05-27 77 views

回答

9

现在有上的NuGet一个模块,使用DLR来实现动态操作。 FSharp.Interop.Dynamic

它比很多外部片段有几个优点。

  • 性能,它使用Dynamitey为DLR调用它实现缓存,是一个PCL库
  • 句柄返回void方法,你如果不抛弃这些结果得到的结合异常。
  • dlr处理通过函数自动调用委托返回的情况,这也将允许您对FSharpFunc执行相同操作
  • 添加!前缀运算符来处理直接调用在运行时没有类型的动态对象和函数。

    它的开源,Apache许可证,你可以看看implementation和基本单元测试example cases

5

是的。您可以在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#中的快乐动态编码:)

+0

tnx。奇怪谷歌怎么没有出现在F#dlr/dynamic dispatch上的链接:\ 我的google-fu吸收 – 2011-05-27 09:25:57

+0

不客气。你是对的,它没有出现在谷歌查询中。 – 2011-05-27 09:27:57

+1

其实?在F#中几乎与C#中的动态相同,而Tomas的存储过程示例不使用DLR。见托马斯的答案和其他相关问题。 – 2011-05-27 13:34:39

8

正如eriawan提到的那样,?运算符的行为有点像C#中的dynamic类型。有关调用SQL的文章并不依赖DLR中的任何内容,因为您可以提供自己的?运算符实现,并且编译器直接使用它。

我还写了一个简单的例子,说明如何使用?运算符来调用使用DLR的成员,它是available on F# snippets,还有一个更多sophisticated version by Matthew Podwysocki。另一个片段显示如何使用它来调用标准.NET types using Reflection

参见: