F#:如何在类型中定义计算的 属性?
F#: How can I define a computed property in a type?
在 C# 中,我可以这样定义计算的 属性:
public class MyViewModel
{
public DateTime StartDate { get; set; }
public string StartDateFormatted => StartDate.ToString("yyyy.MM.dd h:mm tt");
}
我如何在 F# 中执行此操作?
[<DataContract>]
[<CLIMutable>]
type MyViewModel = {
[<DataMember>] StartDate : DateTime
[<DataMember>] StartDateFormatted : string // How can I make this a computed property?
}
在 F# 中非常相似:
open System
type MyViewModel() =
member val StartDate = DateTime.Now
member this.StartDateFormatted =
this.StartDate.ToString("yyyy.MM.dd h:mm tt")
let model = MyViewModel()
printfn "%A" model.StartDateFormatted // "2022.04.27 2:56 tt"
请注意,我使用 F# 的对象语法来定义类型,而不是其记录语法。这更接近您在 C# 中熟悉的内容。
如果您想使用记录类型,它看起来应该是这样的:
type MyViewModel =
{
mutable StartDate : DateTime
}
member this.StartDateFormatted =
this.StartDate.ToString("yyyy.MM.dd h:mm tt")
let model = { StartDate = DateTime.Now }
printfn "%A" model.StartDateFormatted
请注意,默认情况下记录是不可变的,因此通常不用于 view-models(在 MVVM 设计中,它会更新以跟踪 UI 中所做的更改)。
在 C# 中,我可以这样定义计算的 属性:
public class MyViewModel
{
public DateTime StartDate { get; set; }
public string StartDateFormatted => StartDate.ToString("yyyy.MM.dd h:mm tt");
}
我如何在 F# 中执行此操作?
[<DataContract>]
[<CLIMutable>]
type MyViewModel = {
[<DataMember>] StartDate : DateTime
[<DataMember>] StartDateFormatted : string // How can I make this a computed property?
}
在 F# 中非常相似:
open System
type MyViewModel() =
member val StartDate = DateTime.Now
member this.StartDateFormatted =
this.StartDate.ToString("yyyy.MM.dd h:mm tt")
let model = MyViewModel()
printfn "%A" model.StartDateFormatted // "2022.04.27 2:56 tt"
请注意,我使用 F# 的对象语法来定义类型,而不是其记录语法。这更接近您在 C# 中熟悉的内容。
如果您想使用记录类型,它看起来应该是这样的:
type MyViewModel =
{
mutable StartDate : DateTime
}
member this.StartDateFormatted =
this.StartDate.ToString("yyyy.MM.dd h:mm tt")
let model = { StartDate = DateTime.Now }
printfn "%A" model.StartDateFormatted
请注意,默认情况下记录是不可变的,因此通常不用于 view-models(在 MVVM 设计中,它会更新以跟踪 UI 中所做的更改)。