构建代码表达式 "Manually"

Building Code Expressions "Manually"

我想构造一个 F# 代码表达式。但是我不想通过代码引用来做到这一点,而是通过对象来构造它。 然而,关于如何做到这一点的文档非常稀缺。

给定以下代码段

type Foo = { foo = string}
let bar = {foo = "foo"}
let ex = <@ bar.foo @>

这会产生 ex

PropertyGet (Some (ValueWithName ({foo = "foo";}, bar)), foo, [])

但我根本无法复制上面那个确切的术语。例如,我在构造函数 ValueWithName.

上找不到任何内容

那我怎么才能

<@ bar.foo @> = PropertyGet (Some (ValueWithName ({foo = "foo";}, bar)), foo, [])

使用库手动构建引文很难正确完成,因此我强烈建议尽可能使用引文文字。但是,如果您愿意,这里是如何实现您的示例:

open Microsoft.FSharp.Quotations

Expr.PropertyGet(
    Expr.ValueWithName({ foo = "foo" }, "bar"), 
    typeof<Foo>.GetProperty("foo"))