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

本文关键字:正确地 反射 迭代 应用程序 设置 | 更新日期: 2023-09-27 17:50:29

我正在尝试使用反射()来迭代c#中的应用程序属性。. NET 3.5使用VS 2010)。代码之所以"有效",是因为它成功地获取了属性。但是,它总是获取在设计时定义的属性值,而不会看到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中的属性?

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

要获得当前值,您需要使用类似于Default的东西。PropertyValues而不是Default。

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

//注意:以上可能不适用于一些多形式的应用程序,即使应用程序前缀在属性前面加上,特别是对于visual studio 2010编译的应用程序与。net框架4

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

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

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

无论如何,你都不应该通过反射来访问它们。

这里一定有什么误会。

如果你想从myapp.exe.config中读取配置,你应该使用ConfigurationManager。这个类允许您直接通过静态属性访问AppSettingsConnectionString,或者通过GetSection方法读取自定义部分。

此外,应用程序配置意味着仅在设计时进行。你不应该在运行时修改myapp.exe.config。从来没有。此文件对于应用程序的每次执行都必须相同。

另外,Properties.Settings.Default.logLevel是什么??

考虑:

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