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 に答える