我能做些什么来获得以下工作?fsharp报价Expr list - > Expr处理
我需要一个接受Expr列表并返回一个Expr(Expr列表 - > Epxr)的函数。
type DataObject() =
let data = System.Collections.Generic.Dictionary<int, obj>()
member this.AddValue propertyIndex value = data.Add(propertyIndex, value)
member this.GetValue propertyIndex =
match data.TryGetValue propertyIndex with
| (true, value) -> value
| (false, _) -> box "property not found"
...
(fun args ->
<@@
let data = new DataObject(values)
args |> List.iteri (fun i arg -> data.AddValue i <@@ (%%arg) : string @@>)
data
@@>)
我所做的数据对象类型添加在ARGS的值,但不知何故,我不能设法得到的代码通过不同的ARGS迭代(参数[0] .. ARGS。[1])。我得到的消息是:
变量'arg'绑定在引号中,但用作拼接表达式的一部分。这是不允许的,因为它可能会避开它的范围。
如果我显式地访问args(args。[0],args。[1],...)该解决方案有效,但只要我尝试添加迭代时遇到问题。由于参数列表的长度很灵活,这对我来说不是一个可行的解决方案。
我试过不同的方法,但没有成功。有一些解决方案吗?
[编辑]
添加托马斯的反馈在我的解决方案带来了我:
type DataObject(values: obj []) =
let propertyMap = new Map<int, obj>(values |> Seq.mapi (fun i value -> (i, value)))
member this.GetValue propertyIndex : obj =
match propertyMap.TryFind propertyIndex with
| Some(value) -> value
| None -> box "property not found"
(fun args ->
let boxedArgs =
args |> List.map (fun arg ->
match arg with
| Quotations.Patterns.Var var ->
if var.Type = typeof<int> then
<@@ (box (%%arg: int)) @@>
else if var.Type = typeof<string> then
<@@ (box (%%arg: string)) @@>
else if var.Type = typeof<System.Guid> then
<@@ (box (%%arg: System.Guid)) @@>
else
failwith ("Aha: " + var.Type.ToString())
| _ -> failwith ("Unknown Expr as parameter"))
<@@ new DataObject(%%(Expr.NewArray(typeof<obj>, boxedArgs))) @@>))
而这个作品!唯一的一点是,我想摆脱if ... else的结构来获得正确的转换。有任何想法吗?
关于编辑,我想你可以用'Expr.Coerce(ARG的typeof)'代替'if' - 这应该给你,代表其他表情'arg的拳击表达'。 –