在运行时迭代properties.settings

时间:2015-09-25 09:19:58

标签: c# loops properties

我创建了32个属性.settings类型为int32 [,]。 我将在运行时读取期间使用它们并写入一些数据并使用foreach命令检查每个设置值。我在迭代属性值时遇到了一些问题。 这是我的代码:

 private void button1_Click(object sender, EventArgs e)
 {
     foreach (SettingsProperty c in Properties.Settings.Default.Properties)
     {
         if (c[0,0]==0)     // i can not reach this byte :(
         {
                c[0, 0] = 1;   // :((
         }
     }
}

2 个答案:

答案 0 :(得分:0)

不幸的是,其他解决方案将运行,但不正确。您可以通过比较来确认:

Properties.Settings.Default.Properties[c.name].DefaultValueProperties.Settings.Default[c.name],如果已为该属性分配了新值,则会发现它们不同 - 即使它已被保存。

DefaultValue不存储当前值;仅限全局范围中的默认值

要获得实际值,您必须迭代Properties.Settings.Default.PropertyValues。像这样:

foreach(SettingsPropertyValue value in Properties.Settings.Default.PropertyValues )
{
  if (value.PropertyValue[0,0] == 0)
  {
    value.PropertyValue[0, 0] = 1;
  }
}

答案 1 :(得分:-1)

SettingsProperty的值存储在其DefaultValue属性中。请尝试以下方法:

private void button1_Click(object sender, EventArgs e)
{
  foreach (SettingsProperty c in Properties.Settings.Default.Properties)
  {
    if (c.DefaultValue[0,0] == 0)
    {
      c.DefaultValue[0, 0] = 1;
    }
  }
}

您可能还想使用Linq简化代码:

private void button1_Click(object sender, EventArgs e)
{
  foreach (SettingsProperty c in Properties.Settings.Default.Properties
                                                .Cast<object>()
                                                .Where(c => ((int[,])((SettingsProperty)c).DefaultValue)[0, 0] == 0))
  {
    c.DefaultValue[0, 0] = 1;
  }
}

或者在一行代码中更好:

private void button1_Click(object sender, EventArgs e)
{
  Properties.Settings.Default.Properties.Cast<object>()
                                        .Where(c => ((int[,])((SettingsProperty)c).DefaultValue)[0, 0] == 0)
                                        .ToList()
                                        .ForEach(c => ((int[,])((SettingsProperty)c).DefaultValue)[0, 0] = 1);

  // .ToList() is added because .ForEach() is not available on IEnumerable<T>
  // I added .Cast<object>() to convert from IEnumerable to IEnumerable<object>. Then I use the cast to SettingsProperty so you can use the DefaultValue.
}

最后,这个问题可能会有所帮助: C# How to loop through Properties.Settings.Default.Properties changing the values