VSTO项目中动态创建Properties.Settings.StringCollection后无法读取的问询
解决VSTO中动态创建Properties.Settings StringCollection后无法获取引用的问题
你在动态创建StringCollection类型设置项时踩了几个关键的坑,我来帮你拆解问题根源,再给出可行的修复方案:
问题根源分析
你当前的代码存在三个核心问题,导致后续无法正确获取设置项的引用:
- 循环内错误调用
Reset():每次循环都执行Properties.Settings.Default.Reset(),会把所有设置重置为默认值,等于刚添加的设置项立刻被清空,完全做了无用功。 - 混淆了
SettingsProperty和实际值:SettingsProperty只是设置项的元数据(比如名称、类型),不是实际存储值的容器,直接转换它肯定会报错。 - 添加新属性后未刷新设置实例:动态添加
SettingsProperty后,需要让Settings实例感知到这些新属性,否则无法正常访问。
修正后的代码示例
第一步:正确动态创建StringCollection设置项
List<TEAMS> teams = JsonConvert.DeserializeObject<List<TEAMS>>(x); List<TEAMS> TEAM_DATA = new List<TEAMS>(); // 绝对不要在循环里调用Reset,会清空所有已创建的设置 // Properties.Settings.Default.Reset(); foreach (TEAMS team in teams) { string settingName = team.name.Replace(" ", String.Empty); // 先检查设置项是否已存在,避免重复添加抛出异常 if (!Properties.Settings.Default.Properties.Cast<SettingsProperty>().Any(p => p.Name == settingName)) { System.Configuration.SettingsProperty property = new System.Configuration.SettingsProperty(settingName); property.DefaultValue = new StringCollection(); // 直接用空的StringCollection做默认值 property.IsReadOnly = false; property.PropertyType = typeof(StringCollection); Properties.Settings.Default.Properties.Add(property); System.Diagnostics.Debug.WriteLine("Added custom setting: " + settingName); } // 保存设置元数据到配置文件 Properties.Settings.Default.Save(); // 刷新Settings实例,让新添加的属性可以被访问 Properties.Settings.Default.Reload(); TEAM_DATA.Add(team); x = await Call.CallURL(baseURI + "path/teams?api-version=2.0"); }
第二步:正确获取动态创建的StringCollection引用
// 遍历所有StringCollection类型的设置项 foreach (SettingsProperty prop in Properties.Settings.Default.Properties) { if (prop.PropertyType == typeof(StringCollection)) { // 通过Settings的索引器获取实际存储的值,这才是正确的方式 StringCollection handler = Properties.Settings.Default[prop.Name] as StringCollection; if (handler != null) { // 这里可以对handler进行操作,比如添加数据 // handler.Add("新的迭代数据"); // 修改后记得保存设置 // Properties.Settings.Default.Save(); } } }
额外注意事项
- 避免重复创建设置项:动态添加的设置项会被持久化到用户目录的配置文件中,下次程序启动时要先检查是否已存在,否则会抛出重复添加的异常。
- 异步操作顺序:你在循环内调用了
await Call.CallURL,要确保这个异步操作不会打乱设置创建的逻辑,必要时可以先批量获取所有团队数据,再统一创建设置项。 - 配置文件清理:卸载程序时,动态添加的设置不会自动删除,需要手动清理用户目录下对应的配置文件。
内容的提问来源于stack exchange,提问作者Journeyman1234
相关产品推荐
相关产品推荐

