这个 C# class 在 F# 中是什么样子的

What does this C# class look like in F#

我有这个 C# class Project:

public class Project
{
    private readonly IList _tasks = new List<>();
    public string Id { get; set; }
    public int Version { get; set; }
    public DateTimeOffset StartedTime { get; set; }
    public string Name { get; set; }

    public Project(ProjectStarted started)
    {
        Version = 1;
        Name = started.Name;
        StartedTime = started.Timestamp;
    }

    

    public void Apply(TaskRecorded recorded, IEvent e)
    {
        Version = e.Version;
        var task = new ProjectTask
        {
            Title = recorded.Title,
            Number = _tasks.Max(x => x.Number) + 1,
            Recorded = recorded.Timestamp
        };

        _tasks.Add(task);
    }

}

public class ProjectTask
{
    public string Title { get; set; }
    public int Number { get; set; }
    public DateTimeOffset Recorded { get; set; }
}

public class TaskRecorded
{
    public string Title { get; set; }
    public DateTimeOffset Timestamp { get; set; }
}

public class ProjectStarted
{
    public string Name { get; set; }
    public DateTimeOffset Timestamp { get; set; }
}

这在 F# 中会是什么样子?

我正在努力使构造函数和 Apply 方法正确。

更新 - 这就是我到目前为止所做的:

type ProjectTask = {
  Title: string
  Number: int
  Recorded: DateTimeOffset
}

type TaskRecorded = {
  Title: string
  Timestamp: DateTimeOffset
}

type ProjectStarted = {
  Name: string
  Timestamp: DateTimeOffset
}

type Project(projectStarted) =
  member val Version = 1
  member val Name = projectStarted.Name
  member val StartedTime = projectStarted.Timestamp
  member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
    Version <- event.Version

我正在尝试更改我在构造函数中创建的 属性 版本的值。

更新 2:

这就是我现在所做的:

type Project(projectStarted) =
  let mutable Version:int64 = int64(1)
  let mutable Tasks = []
  member val Name = projectStarted.Name
  member val StartedTime = projectStarted.Timestamp
  member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
    Version <- event.Version
    let task = { Title=recorded.Title; Number= 1;Recorded = recorded.Timestamp  }
    Tasks = Tasks @ [task]

不确定这是否正确。

这就是我想出的 - 如果这是正确的方法,无论如何寻找一些评论:

type ProjectTask = {
  Title: string
  Number: int
  Recorded: DateTimeOffset
}

type TaskRecorded = {
  Title: string
  Timestamp: DateTimeOffset
}

type ProjectStarted = {
  Name: string
  Timestamp: DateTimeOffset
}


type Project(projectStarted) =
  let mutable Version:int64 = int64(1)
  let mutable Tasks = []
  member val Name = projectStarted.Name
  member val StartedTime = projectStarted.Timestamp
  member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
    Version <- event.Version
    let task = { Title=recorded.Title; Number= 1;Recorded = recorded.Timestamp  }
    Tasks = Tasks @ [task]

您已经很接近了,但是需要进行一些更改以使其与 C# 代码保持一致。使用 let 使变量在 class 的范围内时私有。您还需要 with get, set 相当于 C# 代码中的 { get; set; }。另一件需要注意的事情是 F# 中的 list 是一个链接列表,而不是 C# 中的 List ,它是一个可调整大小的数组,所以通常你想追加到列表的前面而不是像你一样后面在 Apply 中进行。如果您想使用 C# 的 List 的等价物,您需要 ResizeArray。我省略了 Id 成员,因为它没有在任何地方使用。您还会注意到,要访问 class 的成员(与 let 绑定变量相反),您必须使用在 this.Apply.[=22 中命名的 this =]

type Project(projectStarted) =
    let mutable tasks = []

    member val Version: int64 = 1L with get, set
    member val Name = projectStarted.Name with get, set
    member val StartedTime = projectStarted.Timestamp with get, set

    member this.Apply (recorded: TaskRecorded) (event: Events.IEvent) =
        this.Version <- event.Version

        let task =
            { Title = recorded.Title
              Number = 1
              Recorded = recorded.Timestamp }

        tasks <- tasks @ [ task ]