Доступ к значению чтения свойств внутри C# Инициализатор объекта
-
27-10-2019 - |
Вопрос
Я хотел бы ссылаться на свойство на объекте в инициализаторе объекта. Проблема в том, что переменной еще не существует, поэтому я не могу ссылаться на нее как нормальный (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».
Решение
Вы не можете сделать это, как написано, но вы можете определить 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);