我目前正在试用SqlDataConnection
类型提供程序,并想知道如何显示这些类型。
我可以通过某种方式调用printfn "%A"
来显示比类型名称更有意义的内容吗?
答案 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
)...