我正在尝试手工制作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
?
答案 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))