Доступ к элементам из лямбда-выражения в c#? - PullRequest
0 голосов
/ 08 апреля 2020

Я хотел бы получить доступ к своему элементу WPF из лямбда-выражения.

Вот мой упрощенный код:

public static class MyClass
{
    public struct MyStruct
    {
        public Rectangle MyRectangle {get; set;}
        public Button MyButton {get; set;}

        public void MyVoid()
        {
            MyRectangle = new Rectangle();
            MyRectangle.Width = 300;
            MyRectangle.Height = 100;
            MyGrid.Children.Add(MyRectangle);

            MyButton = new Button();
            MyButton.Widht = 200;
            MyButton.Height = 200;
            MyButton.Click += (a, e) =>
            {
                MyRectangle.Fill = Brushes.Red;
            }
            MyGrid.Children.Add(MyButton);
        }
    }
}

Но есть ошибка с MyRectangle в "MyButton.Click" :

Анонимные методы, лямбда-выражения и выражения запросов в структурах не могут получить доступ к членам экземпляра «this».

Может кто-нибудь объяснить, как исправить эту ошибку?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Простое исправление, как сказал @Sean, измените struct на class.

Если оно должно быть struct, вам нужно отнести this к локальной переменной:

MyStruct self = this;

MyButton.Click += (a, e) =>
{
    // Assuming Rectangle here is System.Windows.Shapes.Rectangle
    self.MyRectangle.Fill = Brushes.Red;
}

Я также могу дать вам некоторые объяснения об ошибке:

Ошибка заключается в том, что this, что эффективно ref this в struct, является указатель, который не может быть захвачен и сохранен в Delegate.Target.

Чтобы получить this, захваченный делегатом, вам нужно разыменовать this в локальной переменной и перехватить значение в переменной.

Однако, когда вы делаете выше, компилятор создает защитную копию, то есть self является копией структуры, на которую указывает this. Это означает, что, хотя вы все еще можете вносить изменения в поля / свойства, чьи возвращаемые типы являются ссылочными типами, любые изменения, внесенные в сам экземпляр self, а также в те типы значений, которые возвращают поля / свойства, не будут отражены в this.

0 голосов
/ 16 апреля 2020

Ваше решение не сработало для меня. Чтобы решить эту проблему, я удалил анонимный метод и создал другой за пределами метода «MyVoid».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...