C # Проблема области видимости переменной анонимного метода с IEnumerable <T> - PullRequest
3 голосов
/ 13 апреля 2010

Я пытаюсь перебрать все компоненты и для тех, кто реализует 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 Ответ

5 голосов
/ 13 апреля 2010

Только не закрывайте переменную цикла - скопируйте ее:

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 для каждой итерации цикла - так что каждый делегат будет захватывать этот другой экземпляр. Раньше каждый делегат собирал одну и ту же переменную.

(Это в некотором роде дублирующий вопрос, но это та проблема, которую довольно сложно найти, поэтому я с удовольствием отвечу на нее много раз.)

...