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

时间:2016-11-06 18:48:17

标签: f# quotations

我想从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)。我该怎么做?有时返回值可能是Array或其他Record

提前致谢!

更新

我将在F#的边缘使用此功能,因此需要检查null

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

1 个答案:

答案 0 :(得分:4)

你链接的eval script会让你到一半 - 它会为你计算表达式的实际值。现在剩下要做的就是将该值转换为适当的类型:

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

let valueOfName = getValue name  // valueOfName : string

请记住理论上演员表可能会崩溃,但在实践中不应该发生,因为eval总会返回正确类型的值(除非有它中的一个错误。)