[英]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.