| P.Call(_, mi, [P.Value(value, _); P.PropertyGet(q, propInfo, [])]) -> ...
如何使用GetValue
方法获取propInfo
的值?
修改
基于@Stephen Swensen的建议,我试图这样做:
| P.Call(_, mi, [P.Value(value, _); P.PropertyGet(q, pi, [])]) ->
match q.Value with
| P.PropertyGet(_, pi2, []) -> printfn "%A" <| pi.GetValue(pi2, null)
| _ -> failwith "fail"
然而,它只是抛出异常:
TargetException未处理:对象 与目标类型不匹配。
pi2
在运行时的值为:Some({PropertyGet (None, Author r, [])})
修改
Bahh ......没有注意到pi2
是静态的。
解决方案是:
| P.Call(_, mi, [P.Value(value, _); P.PropertyGet(q, pi, [])]) ->
match q.Value with
| P.PropertyGet(_, pi2, []) ->
let getObj = pi2.GetValue(null, null)
printfn "%A" <| pi.GetValue(getObj, null)
| _ -> failwith "fail"
答案 0 :(得分:2)
它取决于它是什么类型的属性(静态或实例)以及它是否需要任何参数。
根据您的模式匹配,您的属性看起来不会带任何参数,所以我们将它放在一边。
如果是静态属性,则q
为None
,您只需致电propInfo.GetValue(null, null)
。
如果它是实例属性,则q
为Some(instance)
,其中instance
为类型Expr
。这是一个问题。您需要能够将表达式转换为可以作为GetValue
的第一个参数传递的值。但是如果表达式是任意复杂的,那么实现表达式求值程序需要很多工作。