从报价中获取字​​段值并转换为其类型

Get Field Value from Quotation and Cast to Its Type

我想从 Quotation 中的记录中获取字段的键入值。看起来应该是直截了当的,但我有点迷路了。

例如,

type FullName = { First : string; Last : string }

type Name = { Name : FullName }

let t = { Name = { First = "Jon"; Last = "N" } }

let name = <@ t.Name.First @>

然后我想取值 name 并将 Jon 作为 string(而不是 obj)。我该怎么做?有时 return 值可能是 Array 或另一个 Record.

提前致谢!

更新:

我将在 F# 边缘使用此函数,因此它需要检查 null:

let getValue (expr: Quotations.Expr<'t>) =
    match eval expr with
    | null -> None
    | x -> Some ((eval expr) :?> 't)

您链接的 eval script 将使您完成一半的工作 - 它将为您计算表达式的实际值。现在剩下要做的就是将该值转换为适当的类型:

let getValue (expr: Quotations.Expr<'t>) = (eval expr) :?> 't

let valueOfName = getValue name  // valueOfName : string

请记住,理论上 转换可能会崩溃,但实际上这不应该发生,因为 eval 总是 return 的值正确的类型(除非其中有错误)。