PaN*_*1Me 3 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);
}
Run Code Online (Sandbox Code Playgroud)
请问应该如何解决?
只是不要关闭循环变量 - 复制它:
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);
}
Run Code Online (Sandbox Code Playgroud)
这样,您可以copy为循环的每次迭代获取变量的新"实例" - 因此每个委托将捕获该不同的实例.之前,每个代表都捕获相同的变量.
(这在某种程度上是一个重复的问题,但这是一个相对难以搜索的问题,所以我很乐意多次回答.)
| 归档时间: |
|
| 查看次数: |
1082 次 |
| 最近记录: |