繁体   English   中英

从 c# 中的 lambda 表达式访问元素?

[英]Accessing elements from a lambda expression in c#?

我想从 lambda 表达式访问我的 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);
        }
    }
}

但是“MyButton.Click”中的 MyRectangle 存在错误:

结构中的匿名方法、lambda 表达式和查询表达式无法访问“this”的实例成员。

有人可以解释如何解决这个错误吗?

正如@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;
}

我也可以给你一些关于错误的解释:

错误是因为thisstruct中有效地ref this是一个指针,无法捕获并存储在Delegate.Target中。

为了让委托捕获this ,您需要取消对局部变量的引用this捕获变量中的值。

但是,当您执行上述操作时,编译器会创建一个防御性副本,这意味着selfthis指向的结构的副本。 这意味着,虽然您仍然可以更改返回类型为引用类型的字段/属性,但对self实例本身以及返回值类型的字段/属性所做的任何更改都不会反映在this中。

您的解决方案对我不起作用。 为了解决这个问题,我删除了匿名方法,并在“MyVoid”方法之外创建了另一个方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM