我有一个记录类型,它经常出现在嵌套的复杂数据结构中。因为记录类型具有自动生成的ToString
,所以我的较大结构的ToString
变得令人困惑,并且我不在乎记录的字符串表示形式。
因此,我想使用一个空字符串作为记录的代表。覆盖ToString
似乎没有任何作用,使用StructuredFormatDisplay
不能用于空字符串,因为它需要输入格式"Text {Field} Text"
。现在我有
[<StructuredFormatDisplay("{}")>]
type MyRecord
{ 5 fields... }
override __.ToString () = ""
但这会导致The method MyRecord.ToString could not be found
。
那么对记录类型不使用字符串表示的正确方法是什么?
答案 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 =