在c#对象初始化器中访问属性读取值

本文关键字:访问 属性 读取 对象 初始化 | 更新日期: 2023-09-27 17:54:23

我想在对象初始化器中引用对象的属性。问题是变量还不存在,所以我不能像普通的(object.method)那样引用它。我不知道在对象初始化过程中是否有一个关键字来引用创建中的对象

当我编译以下代码时,我得到错误- '名称'宽度'在上下文中不存在。我理解为什么我得到这个错误,但我的问题是:是否有任何语法来做到这一点?

public class Square
{
    public float Width { get; set; }
    public float Height { get; set; }
    public float Area { get { return Width * Height; } }
    public Vector2 Pos { get; set; }
    public Square() { }
    public Square(int width, int height) { Width = width; Height = height; }
}
Square mySquare = new Square(5,4)
{
    Pos = new Vector2(Width, Height) * Area
};

我想引用属性"Width", "Height"answers"Area"在"mySquare"方面

在c#对象初始化器中访问属性读取值

您不能按照写的那样做,但是您可以定义Pos属性来做同样的事情。而不是

public Vector2 Pos { get; set; }

这样做

public Vector2 Pos
{
    get 
    {
        return new Vector2(Width, Height) * Area;
    }
}

当然,对于Pos,任何平方都有相同的定义。我不确定这是不是你想要的。

编辑

根据你的评论,我认为你希望能够为不同的正方形指定不同的Pos值。这是另一个想法。你可以给构造函数添加第三个参数它接受一个委托,然后构造函数可以在内部使用委托来设置属性。然后,当你创建一个新的正方形时,你只需要传入一个lambda来表示你想要的表达式。像这样:

public Square(int width, int height, Func<Square, Vector2> pos) 
{ 
    Width = width; 
    Height = height; 
    Pos = pos(this);
}
然后

Square mySquare = new Square(4, 5, sq => new Vector2(sq.Width, sq.Height) * sq.Area);