4

可能だとは思いませんが、これに似たようなことをして、Type 拡張機能を介してカスタム フォーマットを許可することはできますか?

[<StructuredFormatDisplayAttribute("Rate: {PrettyPrinter}")>]
type Rate with 
    member x.PrettyPrinter = x.Title + string x.Value

注:組み込みの拡張機能(同じアセンブリ)としては可能ですが、オプションの拡張機能としては可能ではないようです

そうでない場合、誰かが良い代替手段を持っていない限り、これは機能要求になる可能性があると思いますか?

4

2 に答える 2

2

あなたが言うように、StructuredFormatDisplayAttributeプロパティとしてコンパイルされたメンバーに対してのみ機能します (標準プロパティ、同じアセンブリ拡張機能を含みますが、拡張機能メンバーは含まれません)。カバーの下では、リフレクションを使用してアクセスします (ご覧のとおり、非公開にすることもできます)。

let getProperty (obj: obj) name =
    let ty = obj.GetType()
    ty.InvokeMember(name, (BindingFlags.GetProperty ||| BindingFlags.Instance ||| 
        BindingFlags.Public ||| BindingFlags.NonPublic), 
        null, obj, [| |],CultureInfo.InvariantCulture)

デバッグ目的でこれが必要な場合は、このDebuggerTypeProxy属性が代わりになる可能性があります ( MSDN のドキュメントを参照してください)。これにより、元の型を、デバッガーで型を表示するために使用されるプロキシ型に置き換えることができます。(しかし、属性は拡張機能ではなく、実際の型定義に配置する必要があると思います。)

于 2012-10-02T14:44:16.377 に答える
2

いいえ、できません。FSI では、 を使用fsi.AddPrinterして出力をカスタマイズできます。

fsi.AddPrinter (fun (x: Rate) -> x.Title + string x.Value)

編集

Printf一般的な文字列の書式設定では、%a書式指定子を使用できます。いくつかの追加機能により、これがより便利になります。

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module Rate =
  let stringify (x: Rate) = x.Title + string x.Value
  let print rate = printf "%s" (stringify rate)

printf "Rate: %a" (fun _ -> Rate.print) rate
let formattedString = sprintf "Rate: %a" (fun _ -> Rate.stringify) rate
于 2012-10-02T14:07:35.523 に答える