如何使用反射在C#中正确迭代应用程序设置

时间:2011-04-15 15:28:13

标签: c#

我正在尝试使用反射(使用VS 2010的.NET 3.5)在C#中迭代应用程序属性。代码"工作"因为它成功获得了属性。但是,它始终获取在设计时定义的属性值,并且不会在myapp.exe.config中看到当前值。我通过名称直接访问的属性确实反映了.config文件中的内容。这是基于反射的代码,它只能看到设计时属性:

List<StringDictionary> dictList = new List<StringDictionary>();
  StringCollection bogus = new StringCollection();
  foreach (PropertyInfo info in Properties.Settings.Default.GetType().GetProperties())
  {
    if (!("logLevel".Equals(info.Name) || "eventURL".Equals(info.Name)))
    {
      if (bogus.GetType().IsAssignableFrom(info.PropertyType))
      {
        StringCollection rawConfig = (StringCollection)info.GetValue(Properties.Settings.Default, null);
        // do something
      }
    }
  }

此代码确实获取了myapp.exe.config中的当前值。

String logLevelStr = Properties.Settings.Default.logLevel

在我的反射代码中我做错了什么导致我只提取在设计时定义的属性而不是myapp.exe.config中当前的属性?

4 个答案:

答案 0 :(得分:2)

要获取当前值,您需要使用类似这样的内容来查看Default.PropertyValues而不是Default.Properties

 foreach (SettingsPropertyValue  property  in Properties.Settings.Default.PropertyValues)
            {
                Debug.WriteLine(string.Format("Property {0}'s value is {1}",property.Name,property.PropertyValue));
            }

//注意:以上内容可能无法在某些多表单应用中使用,即使应用前缀预先放在属性esp前面,用于Visual Studio 2010编译应用程序.net frame work 4

答案 1 :(得分:1)

我认为这里有一个根本的误解。设置可以是两种类型之一 - 应用程序设置和用户设置。

应用程序设置仅在设计时编写。正如Henk指出的那样,如果您是管理员,可以在部署后编辑它们,但这不是真正的意图。此外,应该注意的是,虽然应用程序设置存储在.config文件中,但它们只读取一次然后缓存在内存中。这就是编辑文件时没有看到新值的原因。

用户设置可以在运行时由应用程序代码覆盖并保存,但它们保存在用户范围内,因此运行相同应用程序的其他用户可以具有不同的值。意图有用户偏好之类的东西。设置设计器网格中有一个下拉列表,用于在每个设置的应用程序和用户范围之间切换。

无论哪种方式,你都不应该通过反思来访问它们。

答案 2 :(得分:0)

这里肯定存在某种误解。

如果要从myapp.exe.config读取配置,则应使用ConfigurationManager。通过此类,您可以直接通过静态属性访问AppSettingsConnectionString,或通过GetSection方法阅读自定义部分。

此外,应用程序配置仅限于设计时。您不应该在运行时更改myapp.exe.config。决不。每次执行应用程序时,此文件必须相同。

旁边,什么是Properties.Settings.Default.logLevel ???

答案 3 :(得分:0)

考虑:

foreach (SettingsProperty sp in Settings.Default.Properties)
{
  Console.WriteLine(sp.Name + "=" + Settings.Default.Properties.Default[sp.Name].ToString());
}