F# - 手动创建Expr

时间:2011-04-27 16:24:06

标签: f#

我正在尝试手工制作Expr<'a -> string,经过几个小时阅读并试着放弃..

但是,我确实弄清楚如何编写C#版本:

let buildExpression<'a> =
    let p = E.Parameter(typeof<'a>)
    E.Lambda<F<'a,string>>(p)

将产生:

Expression<Func<'a, string>>

所以我的问题是,如何使用Expr<'a -> string>模块创建Expr

1 个答案:

答案 0 :(得分:2)

C#示例有点可疑,如果你调用了buildExpression<int>,那么结果将是一个表达式(在C#sytnax中):Func<int, string>(x => x),它的类型错误。我猜C#不会在构建时检查类型,但如果你尝试编译它,它可能会崩溃。

我想你想构建像x => x.Foo这样的东西。然后下面的代码片段可以解决这个问题:

open Microsoft.FSharp.Quotations

type Foo() =
  member x.Prop = "hello"

// Create a new variable 'x'
let arg = Var.Global("x", typeof<Foo>)
// Use Reflection to get information about the 'Prop' member
let propInfo = typeof<Foo>.GetProperty("Prop")
// Create a lambda 'fun x -> x.Prop'
let e = Expr.Lambda(arg, Expr.PropertyGet(Expr.Var(arg), propInfo))