簡體   English   中英

C#:將參數傳遞給回調

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

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