簡體   English   中英

通過作為參數傳遞的委托來操作對象的字段

[英]Manipulate object's fields by a delegate passed as parameter

我正在創建一個自定義對話框類。 它在構造函數中采用OptionObject對象的列表。 在某個時候它會顯示出來,並且取決於用戶單擊哪個選項,將執行注入到OptionObject中的操作。

public class OptionObject
    {
        public object Id { get; set; }
        public string Text { get; set; }

        public Action Action { get; set; }

        public OptionObject(object id, string text, Action action)
        {
            this.Id = id;
            this.Text = text;
            this.Action = action;
        } 
}

這是DialogWindow調用動作的方式:

this.Options.Tap += (sender, args) =>   // Options is a ListBox
                                    {
                                        var o = sender as ListBox;
                                        var x = o.SelectedItem as OptionObject;
                                        if(x!=null)
                                            x.Action();
                                        this.IsOpen = false;
                                    };

最后,我嘗試在另一頁上使用我的對話框:

foreach (var o in eventsOnDate)
                {
                    chooseEventDialogWindow.Data.OptionsList.Add(new OptionObject(o.Text, ()=> /*### don't know what to put in here ###*/ ));
                }

問題在於OptionObject.Action有時需要OptionObject.Id屬性。 如何在上面的截圖中訪問它?

編輯

如果可能的話,我不想將任何參數傳遞到此lambda表達式中,因為有時不需要此ID。 如果這是正確的方法,則可選參數會很好。

聚苯乙烯

這對於該問題並不重要,但是為了避免不必要的討論,此對話框基於telerik的RadWindow。

Action是沒有參數且不返回值的方法,因此在創建Action委托時,您必須封裝OptionObject.ID屬性:

object id = new object();
Action act = () => DoSomethingWithIdAndReturnVoid(id);
OptionObject opt = new OptionObject(id, "some text", act);
opt.Action();

或者像Henk在評論中建議的那樣做,即創建一個具有輸入參數Action

object id = new object();
Action<object> act = (x) => DoSomethingWithIdAndReturnVoid(x);
OptionObject opt = new OptionObject(id, "some text", act);
opt.Action(opt.ID);

要知道,改變封閉的變量與打交道時,只有正常工作引用類型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM