F#动态对象访问

有没有办法在F#中访问类似于C#dynamic的DLR对象(例如,DynamicObject子类实例)成员(属性和方法)?

现在nuget上有一个模块,它使用dlr来实现动态操作符。 FSharp.Interop.Dynamic

与许多片段相比,它有几个优点。

  • 性能它使用Dynamitey进行实现缓存的dlr调用,并且是一个PCL库
  • 处理返回void的方法,如果不丢弃那些结果,则会得到绑定exception。
  • dlr处理由函数自动调用委托返回的情况,这也允许你对FSharpFunc执行相同的操作
  • 添加!? 前缀运算符,用于处理直接调用动态对象和在运行时没有类型的函数。

    它的开源,Apache许可证,你可以看一下实现和基本unit testing的例子 。

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

我还写了一个如何使用的简短例子? 运营商使用DLR呼叫成员,这可以在F#片段上找到 , 而Matthew Podwysocki则有更复杂的版本 。 另一个片段展示了如何使用它来使用Reflection调用标准.NET类型 。

也可以看看:

  • 寻找健壮,通用的op_Dynamic实现

是的。 你可以用? F#中的运算符,它将在.NET 4.0中的C#和VB.NET中以相同的方式执行动态类型。 首先,您可以从Tomas Petricek的博客中阅读此示例Dynamic 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#中的快乐动态编码:)