我有一个控制台应用程序,我正在从C到C#重建.该应用程序必须能够支持存储信息的传统方法,例如来自命令行的参数和来自定制每次运行的文件(称为系统参数)的参数.系统参数文件是纯文本的,带有一个简单的键:值结构.
我应该将这些不同的参数组合到一个Configuration对象中吗?
如何从代码中调用此配置对象来存储参数?
如何从代码中调用此配置对象来检索参数?
该对象应该是强类型的吗?
我将需要从代码中的许多不同位置访问此结构,在不将对象本身传递到各处的情况下检索对象中的值的最优雅方法是什么?
我有一种感觉,它应该是一个强类型的单一对象,它应该是一个实例化的对象,使用静态检索方法从存储库中检索,但我真的想要验证这个方法.
提前致谢
我会使用如下的单个配置对象:
using System; using System.IO; using System.Reflection; public sealed class Setting { public static int FrameMax { get; set; } public static string VideoDir { get; set; } static readonly string SETTINGS = "Settings.ini"; static readonly Setting instance = new Setting(); Setting() {} static Setting() { string property = ""; string[] settings = File.ReadAllLines(SETTINGS); foreach (string s in settings) try { string[] split = s.Split(new char[] { ':' }, 2); if (split.Length != 2) continue; property = split[0].Trim(); string value = split[1].Trim(); PropertyInfo propInfo = instance.GetType().GetProperty(property); switch (propInfo.PropertyType.Name) { case "Int32": propInfo.SetValue(null, Convert.ToInt32(value), null); break; case "String": propInfo.SetValue(null, value, null); break; } } catch { throw new Exception("Invalid setting '" + property + "'"); } } }
由于这是一个单例,它将在第一次public static
从Setting
对象引用属性时创建一个且只有一个实例.
创建对象时,它从Settings.ini
文件中读取.设置文件是纯文本文件,其key : value
结构简单,如下所示:
FrameMax : 12 VideoDir : C:\Videos\Best
该对象使用反射来发现每个属性并存储其初始值.在此示例中,定义了两个属性:
public static int FrameMax { get; set; } public static string VideoDir { get; set; }
代码作为书面句柄Int32
和String
类型.通过向case
语句添加其他语句switch
,您可以轻松添加对类似Float
和的类型的支持Decimal
.
要更改设置,您可以使用以下内容:
Setting.FrameMax = 5;
要检索设置,您可以使用以下内容:
if (Setting.FrameMax > 10) ...
您会注意到所有属性都是强类型的.此外,您不必传递Setting
对象,因为所有Setting
属性static
始终可用.
我希望这个想法很有帮助.
我喜欢用Settings
.这些可以通过使用"添加新文件"对话框创建"设置文件"或从"项目属性"添加默认设置文件来自动生成.每个设置可以在用户或应用程序范围内,该范围控制用户是否可以更改它们或者它们被限制为其默认值.使用该Save()
方法可以轻松保存它们并自动加载到静态Default
属性中.
此类似乎适用于应用程序或基于用户的设置.我正在寻找每次运行的设置.在这种情况下你还会推荐使用这个类吗? - x97mdr
是.如果您同时具有基于用户/应用程序的设置和每次运行设置,则应使用两个不同的类 - 正常(已保存)设置和每次运行设置.只要您不保存每次运行设置,您应该是安全的,并且设置仍然非常容易使用.这些是静态设置.如果同一个应用程序运行需要多个实例 - 这是错误的方法.