问题只是捕获变量而不是值.这是一个大致相同但稍微简单的解决方案:
public AddMyColumn(DelegateGrid.ValueGetter getter) { if (lastGetter != null) { DelegateGrid.ValueGetter newLastGetter = lastGetter; base.AddColumn(new DelegateColumn(delegate(MyObj obj) { return getter(obj)-newLastGetter(obj); })); } // ... }
基本上没有必要创建一个新的委托实例 - 委托是不可变的,所以你可以只使用赋值复制值.
就捕获的值而言,这实际上并不是特定于委托的问题 - 这通常是匿名方法和lambda表达式的常见问题.典型的例子是;
Listactions = new List (); for (int i=0; i < 10; i++) { actions.Add(() => Console.WriteLine(i)); } foreach (Action action in actions) { action(); }
这打印"10"10次.要打印0-9,您需要再次更改捕获变量的范围:
Listactions = new List (); for (int i=0; i < 10; i++) { int copy = i; actions.Add(() => Console.WriteLine(copy)); } foreach (Action action in actions) { action(); }