You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VSTO项目中动态创建Properties.Settings.StringCollection后无法读取的问询

解决VSTO中动态创建Properties.Settings StringCollection后无法获取引用的问题

你在动态创建StringCollection类型设置项时踩了几个关键的坑,我来帮你拆解问题根源,再给出可行的修复方案:

问题根源分析

你当前的代码存在三个核心问题,导致后续无法正确获取设置项的引用:

  1. 循环内错误调用Reset():每次循环都执行Properties.Settings.Default.Reset(),会把所有设置重置为默认值,等于刚添加的设置项立刻被清空,完全做了无用功。
  2. 混淆了SettingsProperty和实际值:SettingsProperty只是设置项的元数据(比如名称、类型),不是实际存储值的容器,直接转换它肯定会报错。
  3. 添加新属性后未刷新设置实例:动态添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:51:49