结合属性设置器“init 和 private”C#9

问题描述

我询问了新的 C#9 特性“init 属性设置器”。下面是一个例子:

public class MyClass
{
    public int Id { get; init; }
    public int Name { get; init; }
    public int Position { get; init; }
}

我的问题是如何在初始化后更新“Position”的值。我想要这样的东西:

public class MyClass
{
    public int Id { get; init; }
    public int Name { get; init; }
    public int Position { get; init + private set; }

    public void MoveMyClass(int newPositionIndex)
    {
        // Some business code...
        Position = newPositionIndex;
    }
}

在我的真实项目中,MyClass一个实例由实体框架初始化。然后我在上面调用一些业务方法。规则是只允许业务方法属性上设置值,所以我至少需要私有设置器。但是如果我有私有的 setter,那么实体框架就不能初始化属性

解决方法

C#9 中的自动属性似乎没有此功能。

为了解决这个问题,我将 init 与完整的属性样式(而不是 auto 属性)结合起来。 Maybee C#10 或更高版本将支持这样的访问修饰符。

public class MyClass
{
    private int _position;

    public int Id { get; init; }
    public int Name { get; init; }
    public int Position { get => _position; init => _position = value; }

    public void MoveMyClass(int newPositionIndex)
    {
        // Some business code...
        _position = newPositionIndex;
    }
}