reflection - 如何使用 F# 反射库?

标签 reflection f#

我正在尝试遵循此示例(来自 Rob Pickering 的 "Foundations of F#" 书的第 137 页),但我无法使其与最新的 F# CTP 一起使用。

我似乎在第 3 行缺少“值”的定义

Value.GetInfo(x)

这会产生:

error FS0039: The namespace or module 'Value' is not defined.

谁能告诉我这是从哪里来的,或者如果现在以不同的方式完成的话,新的语法是什么? (温柔点——这是我第一次玩 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)

最佳答案

为 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)

关于reflection - 如何使用 F# 反射库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1109242/

相关文章:

reflection - 调用镜像的全局功能

scala - 是否可以获取运行时实例的 typeTag?

java - 检查并打印嵌套的 Javabean 属性

c# - 如何从 StackTrace 获取参数值

f# - 无法引用 F# 类库

f# - 为什么 F#'s printf non-existent in OCaml' s printf 中的 %A 说明符是?

f# - 在 F# 中一次强制执行一个异步 Observable

java - 加载从目录中的 jar 扩展另一个类的类

c# - 让!在异步的 seq {...} 中不允许吗?

c# - 在 F# 中声明私有(private)静态成员?