从报价中获取字段值并转换为其类型
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 的值正确的类型(除非其中有错误)。
我想从 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 的值正确的类型(除非其中有错误)。