The .net framework provides a powerful way to provide application settings in app.config file. There is also the ability to use command line parameters but they are accessed in completely different fashion. I created couple of classes to simplify parameters handling and provide a declarative syntax.
public class MyAppsSettings : Settings { [CommandLineParam("/u")] public string UserName { get; set; } [CommandLineParam("/p")] public string Password { get; set; } [ConnectionString("MyDB")] public string MyDBConnStr { get; set; } [AppSetting("Mode")] public string Mode { get; set; } [AppSetting("DefaultMode", "Test")] public string DefaultMode { get; set; } }
Here is the complete source code:
[AttributeUsage(AttributeTargets.Property)] public class CommandLineParamAttribute : Attribute { public string Name { get; set; } public string DefaultValue { get; set; } public CommandLineParamAttribute(string Name) { this.Name = Name; this.DefaultValue = string.Empty; } public CommandLineParamAttribute(string Name, string DefaultValue) { this.Name = Name; this.DefaultValue = DefaultValue; } } [AttributeUsage(AttributeTargets.Property)] public class ConnectionStringAttribute : Attribute { public string Name { get; set; } public ConnectionStringAttribute(string Name) { this.Name = Name; } } [AttributeUsage(AttributeTargets.Property)] public class AppSettingAttribute : Attribute { public string Key { get; set; } public string DefaultValue { get; set; } public AppSettingAttribute(string Key) { this.Key = Key; this.DefaultValue = string.Empty; } public AppSettingAttribute(string Key, string DefaultValue) { this.Key = Key; this.DefaultValue = DefaultValue; } } public class Settings { public Settings() { CommandLineParams clp = new CommandLineParams(); Type type = this.GetType(); foreach (PropertyInfo pi in type.GetProperties()) { object[] arr = pi.GetCustomAttributes(true); foreach (object o in arr) { if (o is CommandLineParamAttribute) { string name = ((CommandLineParamAttribute)o).Name; string value = ((CommandLineParamAttribute)o).DefaultValue; if (clp.Contains(name)) value = clp[name]; pi.SetValue(this, value, null); } if (o is ConnectionStringAttribute) { string name = ((ConnectionStringAttribute)o).Name; string conn = ConfigurationManager.ConnectionStrings[name].ConnectionString; pi.SetValue(this, conn, null); } if (o is AppSettingAttribute) { string key = ((AppSettingAttribute)o).Key; string value = ((AppSettingAttribute)o).DefaultValue; if (ConfigurationManager.AppSettings.AllKeys.Contains(key)) value = ConfigurationManager.AppSettings[key]; pi.SetValue(this, value, null); } } } } }