[英]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;
}
我也可以给你一些关于错误的解释:
错误是因为this
在struct
中有效地ref this
是一个指针,无法捕获并存储在Delegate.Target
中。
为了让委托捕获this
,您需要取消对局部变量的引用this
捕获变量中的值。
但是,当您执行上述操作时,编译器会创建一个防御性副本,这意味着self
是this
指向的结构的副本。 这意味着,虽然您仍然可以更改返回类型为引用类型的字段/属性,但对self
实例本身以及返回值类型的字段/属性所做的任何更改都不会反映在this
中。
您的解决方案对我不起作用。 为了解决这个问题,我删除了匿名方法,并在“MyVoid”方法之外创建了另一个方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.