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 に答える