F#动态对象访问

本文关键字:访问 对象 动态 | 更新日期: 2023-09-27 17:57:59

是否有一种方法可以访问F#中类似于C#动态的DLR对象(例如DynamicObject子类实例)成员(属性和方法)?

F#动态对象访问

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

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

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

    它是开源的,Apache许可证,您可以查看实现和基本的单元测试示例。

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

我还写了一个关于如何使用?运算符使用DLR调用成员的简短示例,DLR在F#代码段中可用,Matthew Podwysocki提供了一个更复杂的版本。另一个片段展示了如何使用它来使用反射调用标准.NET类型。

另请参阅:

  • 寻找健壮的通用op_Dynamic实现

是的。您可以在F#中使用?运算符,它将在C#和.NET 4.0中的VB.NET中执行相同的动态类型。首先,您可以从Tomas 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

如果您曾经尝试调用SQL存储直接使用SqlCommand,那么您肯定可以欣赏此代码的优雅一小条现在让我们来看看更大的例子和一些整洁的使这成为可能的技巧。。。

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