F#Type提供商打印

时间:2012-10-17 02:04:13

标签: f# type-providers

我目前正在试用SqlDataConnection类型提供程序,并想知道如何显示这些类型。

我可以通过某种方式调用printfn "%A"来显示比类型名称更有意义的内容吗?

1 个答案:

答案 0 :(得分:2)

我认为没有办法拦截printfn "%A"对类型提供程序生成的现有类型(无法修改)的行为。如果您可以修改类型提供程序,则可以更改它以为生成的类型生成StructuredFormatDisplay属性,但SqlDataConnection无法实现这一点。

如果您在F#Interactive中使用它,那么您可以使用fsi.AddPrintTransformer来定义单个值在某些计算结果时的打印方式。例如:

// Using Northwind database as a sample
type DB = SqlDataConnection<"Data Source=.\\SQLExpress;Initial Catalog=Northwind;...">
let db = DB.GetDataContext()

// A simple formatter that creates a list with property names and values
let formatAny (o:obj) = 
  [ for p in o.GetType().GetProperties() ->
      p.Name, p.GetValue(o) ]

// Print all Northwind products using the formatter
fsi.AddPrintTransformer(fun (p:DB.ServiceTypes.Products) ->
  formatAny p |> box)

// Take the first product - will be printed using custom formatter
query { for p in db.Products do head }

指定的PrintTransformer仅在F#interactive中获得值时使用。当您为返回多个对象的查询编写query { .. } |> List.ofSeq时,它也会起作用。但对于printfn "%A",您必须明确调用转换函数(如formatAny)...