Доступ к значению чтения свойства внутри инициализатора объекта C # - PullRequest
0 голосов
/ 02 мая 2011

Я хотел бы сослаться на свойство объекта в инициализаторе объекта. Проблема в том, что переменная еще не существует, поэтому я не могу ссылаться на нее как обычно (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
};

Я хотел бы сослаться на свойства "Ширина", "Высота" и "Площадь" в терминах "mySquare".

1 Ответ

1 голос
/ 02 мая 2011

Вы не можете сделать это так, как написано, но вы можете определить свойство Pos, чтобы сделать то же самое. Вместо

public Vector2 Pos { get; set; }

сделать это

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

Конечно, тогда любой квадрат имеет то же определение для Pos. Не уверен, что ты этого хочешь.

Редактировать

На основании вашего комментария, насколько я понимаю, вы хотите иметь возможность указать значение Pos для разных квадратов. Вот еще одна идея. Вы можете добавить третий аргумент в конструктор, который принимает делегат, и тогда конструктор может использовать делегат внутри, чтобы установить свойство. Затем, когда вы создаете новый квадрат, вы просто передаете лямбду для нужного выражения. Примерно так:

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);
...