c# – 在for循环中分配委托的问题
发布时间:2020-12-15 08:39:52 所属栏目:百科 来源:网络整理
导读:我有一个能够插件(MEF)的应用程序. 插件是导入服务的 WPF UserControls. 用户可以从应用程序的主菜单中选择所需的插件. 为此,我使用以下循环: foreach(IToolPlugin Plugin in ToolPlugins){ Plugin.Init(); MenuItem PluginMenuItem = Plugin.MenuItem; //N
我有一个能够插件(MEF)的应用程序.
插件是导入服务的 WPF UserControls. 用户可以从应用程序的主菜单中选择所需的插件. 为此,我使用以下循环: foreach(IToolPlugin Plugin in ToolPlugins) { Plugin.Init(); MenuItem PluginMenuItem = Plugin.MenuItem; //New MenuItem but with Header set. PluginMenuItem.Click += new RoutedEventHandler(delegate(object o,RoutedEventArgs e) { DoSomething(Plugin.Control);}); PluginsMenu.Items.add(PluginMenuItem); } 这对于单个项目非常好.但是,只要我有一个以上的插件,所有菜单项都会执行最后一个循环的委托.或者至少使用最后一个循环的Plugin.Control. 我怎样才能解决这个问题? 解决方法
在循环的每次迭代中,在关闭中使用它之前,必须“捕获”迭代值的值.否则,每个委托中的插件将指向插件的最后一个值,而不是创建匿名函数时它所持有的值.
您可以在此处阅读Eric Lippert的更深入的解释: Closing over the loop variable considered harmful – Fabulous Adventures in Coding 简而言之,编写foreach循环的正确方法是: foreach(IToolPlugin Plugin in ToolPlugins) { Plugin.Init(); MenuItem PluginMenuItem = Plugin.MenuItem; IToolPlugin capturedPlugin = Plugin; PluginMenuItem.Click += new RoutedEventHandler(delegate(object o,RoutedEventArgs e) { DoSomething(capturedPlugin.Control); }); PluginsMenu.Items.add(PluginMenuItem); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |