F# - 反射,模式匹配:GetValue

时间:2011-06-14 19:50:27

标签: f#

| 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"

1 个答案:

答案 0 :(得分:2)

它取决于它是什么类型的属性(静态或实例)以及它是否需要任何参数。

根据您的模式匹配,您的属性看起来不会带任何参数,所以我们将它放在一边。

如果是静态属性,则qNone,您只需致电propInfo.GetValue(null, null)

如果它是实例属性,则qSome(instance),其中instance为类型Expr。这是一个问题。您需要能够将表​​达式转换为可以作为GetValue的第一个参数传递的值。但是如果表达式是任意复杂的,那么实现表达式求值程序需要很多工作。