2

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

有什么方法可以让我的调用printfn "%A"显示比类型名称更有意义的东西吗?

4

1 回答 1

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# 交互中获取值作为结果时才使用指定的值。当您编写query { .. } |> List.ofSeq返回多个对象的查询时,它也将起作用。但是对于printfn "%A",您必须formatAny显式调用转换函数(如 )...

于 2012-10-17T22:45:14.600 回答