如何在记录上禁用ToString

时间:2018-06-27 13:04:26

标签: f#

我有一个记录类型,它经常出现在嵌套的复杂数据结构中。因为记录类型具有自动生成的ToString,所以我的较大结构的ToString变得令人困惑,并且我不在乎记录的字符串表示形式。
因此,我想使用一个空字符串作为记录的代表。覆盖ToString似乎没有任何作用,使用StructuredFormatDisplay不能用于空字符串,因为它需要输入格式"Text {Field} Text"。现在我有

[<StructuredFormatDisplay("{}")>]
type MyRecord
    {  5 fields... }

    override __.ToString () = ""

但这会导致The method MyRecord.ToString could not be found

那么对记录类型不使用字符串表示的正确方法是什么?

1 个答案:

答案 0 :(得分:6)

所有评论均提供有关如何实现目标的正确信息。综合考虑,这是在实际情况下的工作,在这种情况下,我希望记录类型始终将空字符串作为其字符串表示形式:

open System

[<StructuredFormatDisplay("{StringDisplay}")>]
type MyRecord =
    {  
        A: int
        B: string
        C: decimal
        D: DateTime
        E: Guid
    }
    member __.StringDisplay = String.Empty
    override this.ToString () = this.StringDisplay

通过这种方式,无论使用什么技术来打印记录,或者外部调用者是否使用其ToString方法,表示形式都将始终相同:

let record = {A = 3; B = "Test"; C = 5.6M; D = DateTime.Now; E = Guid.NewGuid()}
printfn "Structured Format Display:  %A" record
printfn "Implicit ToString Call:  %O" record
printfn "Explicit ToString Call:  %s" <| record.ToString()

此打印:

Structured Format Display:  
Implicit ToString Call:  
Explicit ToString Call:  

要记住的一件事是,这甚至会覆盖F#交互式显示记录的方式。意思是,记录评估本身现在显示为:

val record : MyRecord =