簡體   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