编辑/修改C#应用程序设置

kmo*_*ote 5 c# application-settings settings.settings

.NET配置设置功能不像我想的那么灵活.如果我正确理解应用程序设置,我可以更改/编辑设置时受到限制.在C#中,应用程序设置分为两种不同的类型或范围("应用程序"和"用户"),但两者在如何更改或修改它们方面都有局限性.下表显示了不同之处:

   SCOPE:   |  EDIT AT DESIGN-TIME: |     EDIT AT RUN-TIME:     |  EDIT BETWEEN SESSIONS:
---------------------------------------------------------------------------------------
   User     |   Setings.settings    |  Settings.Default.Save()  |     *Not supported*       
Application |   Setings.settings    |      *Not supported*      |  edit  app.exe.config   

是否有任何"内置"设置功能允许我通过所有三种机制编辑设置?使用配置文件的主要动机之一是允许用户更改默认值而无需重新构建源代码(可以使用应用程序作用域设置完成).但是,不应强制用户编辑.config文件; 他们还应该能够在运行时进行跨设置的更改(可以使用用户范围设置完成).当然必须有某种机制提供两种功能.

BOTTOM LINE:为什么不能app.exe.config在运行时编辑应用程序设置()?这将解决我所有的问题.我知道这可能会导致共享同一台计算机的用户出现问题.但是谁又这样做了?

可能的解决方法:是否有将用户设置配置文件的默认存储位置更改为非隐藏文件夹?


UPDATE(澄清): 我想说的是,我希望能够在更改默认设置设计时,在运行时, 在两者之间的会议(即通过编辑配置文件).但是当使用内置的C#持久性机制时Settings.settings,我必须选择最多2个中的3个.我错过了什么?还有其他我不知道的选择吗?

[ 用例:我想为连接字符串存储"默认"数据库名称,但我希望用户能够在运行时指定不同的数据库(从而成为该用户的"新"默认值).但我还希望能够覆盖配置文件中的默认值,而无需重新运行或重新构建应用程序.

[ 更好的用例:(回复评论)

我有一个配置文件的计算模型,其中包含模型中参数的默认值.用户A启动模型并决定更改多个参数的值.对于该用户的所有未来会话(即,在RunTime编辑),该更改需要持续存在.随后,该用户希望与他的团队共享该修改的配置文件(例如,通过版本控制存储库或电子邮件).这将允许用户B更新其默认参数值(以匹配用户A),而无需在应用程序中手动更改它们(即,在会话之间编辑).所有这些mod都应该在Design-Time之后发生. ]

*我意识到我可以"技术上"编辑位于隐藏的AppData文件夹中的app.exe.config文件中的用户范围设置,但这是一个隐藏文件,并非所有用户都有足够的权限来查看它.(但请参阅上面的"潜在解决方法".)

Glu*_*bus 0

您所需要做的就是结合这两种技术!

在会话开始时,从配置文件中读取配置的设置,并将其存储到可写的全局静态变量(或任何形式的持久性)中。

然后,当用户决定更改此设置时,只需更改该设置的值即可。

public static Program {

    public static string ConnectionString { get; set; }

    void Main(string connectionString) {
         ConnectionString = connectionString;
    }

}

public class SomeOtherClass {
     public void SomeOtherMethod () {
         Program.ConnectionString = "new value";
     }
}
Run Code Online (Sandbox Code Playgroud)

这只是一个非常简单的示例,说明了如何使用它。请注意,您可能会选择从应用程序设置中读取默认值,而不是将字符串作为参数传递给程序。您还可能将用户配置的连接字符串存储到某种数据库中,以便每个用户的数据库可能不同。