使用IEnumerable <t> </t>的C#匿名方法变量范围问题

时间:2010-04-13 09:26:07

标签: c# generics scope anonymous-methods

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

请问如何解决?

1 个答案:

答案 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变量的新“实例” - 因此每个委托将捕获该不同的实例。之前,每个代表都在捕获相同的变量。

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