我正在尝试遍历所有组件,并且对于那些实现ISupportsOpen的人来说,允许打开一个项目。 问题是当调用匿名方法时,组件变量总是相同的元素(来自IEnumerable的外部范围)
foreach (ISupportsOpen component in something.Site.Container.Components.OfType<ISupportsOpen>())
{
MyClass m = new MyClass();
m.Called += new EventHandler(delegate(object sender, EventArgs e)
{
if (component.CanOpenProject(..)) component.OpenProject(..);
});
itemsList.Add(m);
}
请问如何解决?
答案 0 :(得分:5)
不要close over the loop variable - 复制它:
foreach (ISupportsOpen component in
something.Site.Container.Components.OfType<ISupportsOpen>())
{
ISupportsOpen copy = component;
MyClass m = new MyClass();
m.Called += new EventHandler(delegate(object sender, EventArgs e)
{
if (copy.CanOpenProject(..)) copy.OpenProject(..);
});
itemsList.Add(m);
}
这样,您可以为循环的每次迭代获得copy
变量的新“实例” - 因此每个委托将捕获该不同的实例。之前,每个代表都在捕获相同的变量。
(这在某种程度上是一个重复的问题,但这是一个相对难以搜索的问题,所以我很乐意多次回答。)