[英]C#: passing parameters to callbacks
我有一個相當通用的類(Record),我已經添加了一個回調處理程序,所以我可以做類似下面的事情。
record.Save(AfterSaveMethod);
其中還返回創建的記錄的標識號。 我現在的問題是我在循環中有這個嵌套的保存例程,我需要使用/傳遞i
變量!
for (int i; i < count ;i++)
{
record.Save(AfterSaveMethod2) //but I need to pass i through as well
}
我該怎么辦?
\\ _重寫save方法並將其包含在此類(yuk)中,
B \\有一個重載的保存選項,它將一個對象作為參數,因此我可以將它傳遞給我的記錄類,然后將其與標識號合並。 返回身份編號和傳遞對象中包含的任何額外內容(嗯,聽起來有點亂),
C \\有更性感的選擇嗎?
這是匿名方法或lambda表達式真正方便的地方:)
試試這個(假設C#3):
for (int i = 0; i < count; i++)
{
int index = i;
record.Save(id => AfterSaveMethod2(id, index));
}
請注意,此處的lambda表達式是捕獲index
,而不是i
- 這是為了避免關閉循環變量時固有的問題。
您還可以創建一個(線程靜態)上下文對象,它存儲您的“狀態”(在本例中為索引變量值),您可以使用靜態屬性(例如MyContext.Current
)來訪問它。 取決於背景的復雜性......
WCF在OperationContext.Current
,ASP.NET,TransactionScope等中使用了類似的東西。
如果上下文比你的更復雜,並且你不想污染幾種方法的簽名,我認為這個模型非常簡潔。
采用:
// init context
MyContext.Current = new MyContext();
for (var idx = 0; idx < 99; idx++) {
MyContext.Current.Idx = idx;
record.Save(AfterSaveMethod);
}
// uninitialize context
MyContext.Current = null;
(非常簡單的樣本)
如果上下文是[ThreadStatic]
,則可能有多個並發調用,這些調用不會相互影響
class SexierSaveMethod
{
public Int32 Index { get; set; }
public SexierSaveMethod(Int32 i)
{
Index = i;
}
public void AfterSaveMethod()
{
// Use i here
}
}
record.Save(new SexierSaveMethod(i).AfterSaveMethod);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.