F#动态对象访问

Raf*_*tić 14 .net c# f# dynamic-language-runtime

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

jbt*_*ule 10

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

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

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

    它的开源,Apache许可证,你可以看一下实现和基本的单元测试示例案例.


Tom*_*cek 9

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

我还写了一个简短的例子,说明如何使用?运算符来调用使用DLR的成员,这可以在F#片段中找到,并且Matthew Podwysocki有一个更复杂的版本.另一个片段展示了如何使用它来使用Reflection调用标准.NET类型.

也可以看看:


Eri*_*ono 6

是的.您可以?在F#中使用operator,它将在.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
Run Code Online (Sandbox Code Playgroud)

如果您曾尝试使用SqlCommand直接调用SQL存储过程,那么您肯定会欣赏此代码段的优雅.现在让我们来看一个更大的例子,以及一些使这成为可能的巧妙技巧......

有关更多信息,您可以阅读他的文章的其余部分.F#中的快乐动态编码:)