代表/行动没有传递价值

时间:2015-04-20 14:13:30

标签: c# callback delegates

我对使用这种技术有一个非常基本的了解,所以我可能会遗漏一些简单的东西。我想要做的就是添加一个包含TOTAL项的变量,但是当我检查它时,变量似乎被初始化为0。我最好的猜测是超出范围,我正在失去价值。

  1. 我调用一个传递委托(?)

    的函数
    [TestMethod]
    public void Batch_Update_Is_Working()
    {
        DataTable dt = ExcelHelper.ReadAsDataTable(pathFileName);
       EncompassBoxHelper.UpdateBoxes(ec, dt, progess => UpdateProgressBar(pi));
    }
    
  2. 在函数内部我想传回一个值。

     public static void UpdateBoxes(EncompassConnection ec, DataTable dt, Action<ProgressInfo> updateProgress)
     {
        Session s = EncompassSession.Instance(ec.Url, ec.Name, ec.Password);
    
        updateProgress(new ProgressInfo(dt.Rows.Count));
    
  3. 这是存储值的位置。在ItemsTotal中。到目前为止一切都很好。

     public class ProgressInfo
     {
         public int itemsProcessed { get; set; }
         public int itemsTotal { get; set; }
    
         public ProgressInfo()
         {
    
         }
    
         public ProgressInfo(int it)
        {
            itemsTotal = it;
        }
    }
    
  4. 现在当它进入回调时,值为0 ??? pi.itemsProcessed假设为100.

    public void UpdateProgressBar(ProgressInfo pi)
    {
        pi.itemsProcessed++;
        Debug.WriteLine("Progress Info.ItemsProcessed: " + pi.itemsProcessed);
        Debug.WriteLine("Progress Info.ItemsTotal: " + pi.itemsTotal);
    
    }
    

2 个答案:

答案 0 :(得分:1)

更改您的

EncompassBoxHelper.UpdateBoxes(ec, dt, progess => UpdateProgressBar(pi));

EncompassBoxHelper.UpdateBoxes(ec, dt, UpdateProgressBar);

不是发送UpdateProgressBar()方法来匹配UpdateBoxes参数中预期的委托,而是通过转换lambda表达式来创建一个新表达式,告诉它​​使用参数应该在pi方法(UpdateBoxes对象)中传递new ProgressInfo(dt.Rows.Count)而不是那个。

答案 1 :(得分:1)

看起来你的pi变量没有通过引用传递,所以它永远不会真正得到更新。在你的委托函数中,像pi.itemsProcessed ++一样改变一个值并不常见,尽管有办法like this

一旦你的代表支持使用&#34; ref&#34;传递一个变量。关键字,那么您应该可以使用以下内容调用您的委托:

progess => UpdateProgressBar(ref pi)

您也可以将pi设为静态变量,然后也可以从您的代表处更新它,这样您就不必担心传递它。