3

我正在尝试遍历所有组件,并且对于那些实现 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);
}

请问应该怎么解决?

4

1 回答 1

5

只是不要关闭循环变量- 复制它:

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以为循环的每次迭代获得一个新的变量“实例”——因此每个委托都会捕获该不同的实例。以前,每个委托都在捕获相同的变量。

(这在某些方面是一个重复的问题,但这是一种相对难以搜索的问题,所以我很乐意回答很多次。)

于 2010-04-13T09:29:28.007 回答