我如何使用F#Reflection库?

时间:2009-07-10 12:28:46

标签: reflection f#

我试图效仿这个例子(来自Rob Pickering的"Foundations of F#"书的p137),但我无法使用最新的F#CTP。

我似乎错过了第3行'Value'的定义

Value.GetInfo(x)

这会产生:

  

错误FS0039:未定义名称空间或模块“值”。

如果现在以不同的方式完成,那么有人能告诉我它的来源或新语法是什么吗? (要温柔 - 这是我第一次玩F#)

以下是我工作的例子: -

#light
open Microsoft.FSharp.Reflection
let printTupleValues x =
    match Value.GetInfo(x) with
    | TupleValue vals ->
    print_string "("
    vals
    |> List.iteri
        (fun i v ->
            if i <> List.length vals - 1 then
                Printf.printf " %s, " (any_to_string v)
            else
                print_any v)
    print_string " )"
    | _ -> print_string "not a tuple"

printTupleValues ("hello world", 1)

3 个答案:

答案 0 :(得分:4)

为Beta 1或CTP重写了F#反射库。以下是您的代码略微更改以使用新库,并避免使用F#PlusPack(print_string用于兼容OCaml)。

open Microsoft.FSharp.Reflection

let printTupleValues x =
    if FSharpType.IsTuple( x.GetType() ) then
        let s =
            FSharpValue.GetTupleFields( x )
            |> Array.map (fun a -> a.ToString())
            |> Array.reduce (fun a b -> sprintf "%s, %s" a b)
        printfn "(%s)" s
    else 
        printfn "not a tuple"

printTupleValues ("hello world", 1)

答案 1 :(得分:2)

或者,如果您更喜欢使用match来分解元组,那么请尝试使用活动模式。优点是您可以非常轻松地添加对其他类型的支持。

open Microsoft.FSharp.Reflection

let (|ParseTuple|_|) = function
    | o when FSharpType.IsTuple( o.GetType() ) ->
        Some( FSharpValue.GetTupleFields(o) )
    | _ -> None

let printTupleValues = function
    | ParseTuple vals ->
        let s =
            vals
            |> Array.map (fun a -> a.ToString())
            |> Array.reduce (fun a b -> sprintf "%s, %s" a b)
        printfn "(%s)" s
    | _ ->
        printf "not a tuple"

printTupleValues ("hello world", 1)

答案 2 :(得分:1)

我不知道您的功能是否已在当前的F#版本中重命名或删除。 您应该查看IDE的对象资源管理器中的FSharp.Reflection来检查并查看this page