C#:将参数传递给回调

C#:将参数传递给回调,c#,silverlight,callback,C#,Silverlight,Callback,我有一个相当通用的类(记录),我在其中添加了一个回调处理程序,因此我可以执行如下操作 record.Save(AfterSaveMethod); 它还返回所创建记录的标识号。我现在遇到的问题是,我在一个循环中有这个嵌套的save例程,我需要使用/传递I变量 for (int i; i < count ;i++) { record.Save(AfterSaveMethod2) //but I need to pass i through as well } for(int i

我有一个相当通用的类(记录),我在其中添加了一个回调处理程序,因此我可以执行如下操作

record.Save(AfterSaveMethod);
它还返回所创建记录的标识号。我现在遇到的问题是,我在一个循环中有这个嵌套的save例程,我需要使用/传递
I
变量

for (int i; i < count ;i++)
{
    record.Save(AfterSaveMethod2) //but I need to pass i through as well
}  
for(int i;i
我在这里干什么

A \重写save方法并将其包含在此类中(yuk)

B\有一个重载保存选项,该选项将对象作为参数,因此我可以将其传递给我的记录类,然后将其与标识号合并。返回身份号和传递对象中包含的任何额外内容(嗯,听起来有点混乱)


有更性感的选项吗?

这是匿名方法或lambda表达式非常方便的地方:)

试试这个(假设C#3):

for(int i=0;iAfterSaveMethod2(id,索引));
}
请注意,这里的lambda表达式捕获的是
index
,而不是
i
——这是为了避免中固有的问题。

您还可以创建一个(线程静态)上下文对象,它存储您的“状态”(在本例中是索引变量值),您可以使用静态属性(例如
MyContext.Current
)访问该对象. 取决于上下文的复杂性

WCF在
OperationContext.Current
、ASP.NET、TransactionScope等中使用类似的内容

如果上下文比您的上下文更复杂,并且您不想污染几个方法的签名,那么我认为这个模型非常简洁

使用:

//初始化上下文
MyContext.Current=新的MyContext();
对于(var idx=0;idx<99;idx++){
MyContext.Current.Idx=Idx;
记录保存(后保存法);
}
//取消初始化上下文
MyContext.Current=null;
(非常简单的示例)


如果上下文是
[ThreadStatic]
您可以同时调用多个不会相互影响的调用

一个非常优雅的解决方案,Skeet先生!好的,有道理,只需要整理一下foo;)行动是我的代表type@Grayson:那么传递的整数是什么?整数是WCF服务返回的标识号。因此,在本例中,我保存了一条记录,然后在完成时保存了另一条记录,它是该记录的子记录,因此我需要第一条记录中的标识号。(加上索引)好的,这就是标识值——我会适当地调整代码:)
for (int i = 0; i < count; i++)
{
    int index = i;
    record.Save(id => AfterSaveMethod2(id, index));
}
    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);
// 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;