Delegate/Action 没有传值
Delegate/Action is not passing value
我对使用这种技术有非常基本的了解,所以我可能遗漏了一些简单的东西。我想要做的就是添加一个变量来保存 TOTAL 项,但是当我检查它时,该变量似乎被初始化回 0。我最好的猜测是有些事情超出了范围,我失去了价值。
我调用了一个传递委托的函数(?)
[TestMethod]
public void Batch_Update_Is_Working()
{
DataTable dt = ExcelHelper.ReadAsDataTable(pathFileName);
EncompassBoxHelper.UpdateBoxes(ec, dt, progess => UpdateProgressBar(pi));
}
在函数内部我想传回一个值。
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));
这是存储值的地方。在 ItemsTotal 中。目前一切顺利。
public class ProgressInfo
{
public int itemsProcessed { get; set; }
public int itemsTotal { get; set; }
public ProgressInfo()
{
}
public ProgressInfo(int it)
{
itemsTotal = it;
}
}
现在回调的时候值为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);
}
改变你的
EncompassBoxHelper.UpdateBoxes(ec, dt, progess => UpdateProgressBar(pi));
至
EncompassBoxHelper.UpdateBoxes(ec, dt, UpdateProgressBar);
您不是发送 UpdateProgressBar()
方法来匹配 UpdateBoxes
参数中预期的委托,而是通过转换 lambda 表达式创建一个新委托,告诉它使用参数专门调用自身pi
,而不是应该在 UpdateBoxes
方法(new ProgressInfo(dt.Rows.Count)
对象)中传递的那个。
看起来你的 pi 变量没有通过引用传递,所以它永远不会真正更新。老实说,在你的委托函数中改变像 pi.itemsProcessed++ 这样的值并不是很常见,尽管有很多方法可以做到 like this.
一旦您的委托支持使用 "ref" 关键字传入变量,那么您应该可以使用如下方式调用您的委托:
progess => UpdateProgressBar(ref pi)
您也可以将 pi 设为静态变量,然后它也可以从您的委托中更新,这样您就不必担心传递它了。
我对使用这种技术有非常基本的了解,所以我可能遗漏了一些简单的东西。我想要做的就是添加一个变量来保存 TOTAL 项,但是当我检查它时,该变量似乎被初始化回 0。我最好的猜测是有些事情超出了范围,我失去了价值。
我调用了一个传递委托的函数(?)
[TestMethod] public void Batch_Update_Is_Working() { DataTable dt = ExcelHelper.ReadAsDataTable(pathFileName); EncompassBoxHelper.UpdateBoxes(ec, dt, progess => UpdateProgressBar(pi)); }
在函数内部我想传回一个值。
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));
这是存储值的地方。在 ItemsTotal 中。目前一切顺利。
public class ProgressInfo { public int itemsProcessed { get; set; } public int itemsTotal { get; set; } public ProgressInfo() { } public ProgressInfo(int it) { itemsTotal = it; } }
现在回调的时候值为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); }
改变你的
EncompassBoxHelper.UpdateBoxes(ec, dt, progess => UpdateProgressBar(pi));
至
EncompassBoxHelper.UpdateBoxes(ec, dt, UpdateProgressBar);
您不是发送 UpdateProgressBar()
方法来匹配 UpdateBoxes
参数中预期的委托,而是通过转换 lambda 表达式创建一个新委托,告诉它使用参数专门调用自身pi
,而不是应该在 UpdateBoxes
方法(new ProgressInfo(dt.Rows.Count)
对象)中传递的那个。
看起来你的 pi 变量没有通过引用传递,所以它永远不会真正更新。老实说,在你的委托函数中改变像 pi.itemsProcessed++ 这样的值并不是很常见,尽管有很多方法可以做到 like this.
一旦您的委托支持使用 "ref" 关键字传入变量,那么您应该可以使用如下方式调用您的委托:
progess => UpdateProgressBar(ref pi)
您也可以将 pi 设为静态变量,然后它也可以从您的委托中更新,这样您就不必担心传递它了。