我正在尝试遍历所有组件,对于那些实现了 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);
}
请问应该怎么解决?
最佳答案
只是不要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
变量的新“实例” - 因此每个委托(delegate)将捕获该不同的实例。以前,每个委托(delegate)都捕获相同的变量。
(这在某种程度上是一个重复的问题,但它是一种相对难以搜索的问题,所以我很乐意多次回答。)
关于IEnumerable<T> 的 C# 匿名方法变量范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2628397/