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);
}
}
}
}
}
