Dopo i vari post di polemica varia... eccomi qui con un post tecnico. Segue come ho deciso di affrontare il _problema_ del passaggio dei parametri da riga di comando. Essendo che sono abbastanza soddisfatto della pensata (nonostante non sia nulla di eccezionale) ho deciso di persisterla nel mio blog. L'_archiettura_ è composta da una classe di utilità "ProgramArgumentsUtil" che è generica e ho incluso nella mia libreria di Utilità; da una classe specializzata per il contesto del programma "ProgramArguments" che ha il compito di convertire i parametri da stringa a dati tipizzati; e infine la classe "Program" che contiene il main del programma che usa la classe "ProgramArguments".
/// <summary>
/// Classe di utilità per la lettura dei parametri da linea di comando.
/// Ogni parametro si intende nel formato: "{nomeparametro}:{valoreparametro}".
/// I parametri non delimitati dai ":" verranno inseriti per intero come chiave con
/// valore Boolean.TrueString.
/// </summary>
public class ProgramArgumentsUtil
{
#region Fields
private static StringDictionary arguments;
#endregion
#region Constructors
static ProgramArgumentsUtil()
{
arguments = new StringDictionary();
string[] commandLineArguments = Environment.GetCommandLineArgs();
for(int i = 1; i < commandLineArguments.Length; i++)
{
string[] splits = commandLineArguments[i].Split(new char[]{':'}, 2);
if(splits.Length == 2)
{
arguments[splits[0].ToUpper()] = splits[1];
}
else
{
arguments[splits[0].ToUpper()] = Boolean.TrueString;
}
}
}
#endregion
#region Methods
/// <summary>
/// Indica se contiene un argomento.
/// True se l'argomento è stato specificato.
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static bool Contains(string key)
{
return arguments.ContainsKey(key);
}
/// <summary>
/// Recupera argomento per nome, se l'argomento non è
/// specificato torna il valore specificato da default value
/// </summary>
/// <param name="key"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
public static string GetArgument(string key, string defaultValue)
{
string item = arguments[key.ToUpper()];
if(item == null)
{
item = defaultValue;
}
return item;
}
/// <summary>
/// Ritorna la stringa con un quadro riassuntivo dei parametri.
/// </summary>
/// <returns></returns>
public static new string ToString()
{
StringBuilder sb = new StringBuilder();
foreach(string paramName in arguments.Keys)
{
sb.AppendFormat("{0}\t{1}", paramName, arguments[paramName]);
sb.Append(Environment.NewLine);
}
return sb.ToString();
}
#endregion
}
/// <summary>
/// Classe di utilità per la lettura degli argomenti da linea di comando.
/// </summary>
public class ProgramArguments
{
#region Const
const string FILE_INPUT = "in";
const string FORMATO_FILE = "f";
const string MODE = "m";
const string SOLO_VALIDAZIONE = "v";
#endregion
#region FromCommandLineArguments
/// <summary>
/// Lettura e conversione file + eventaule validazione dei dati.
/// </summary>
public static ProgramArguments FromCommandLineArguments()
{
ProgramArguments programArguments = new ProgramArguments();
programArguments.fileName = ProgramArgumentsUtil.GetArgument(FILE_INPUT, string.Empty);
programArguments.formatoFile = ProgramArgumentsUtil.GetArgument(FORMATO_FILE, string.Empty).ToUpper();
programArguments.soloValidazione = ProgramArgumentsUtil.GetArgument(MODE, SOLO_VALIDAZIONE).Equals(SOLO_VALIDAZIONE);
return programArguments;
}
#endregion
#region Fields
private string formatoFile = string.Empty;
private string filename = string.Empty;
private bool soloValidazione = false;
#endregion
#region Constructors
private ProgramArguments()
{
}
#endregion
#region Properties
public string FormatoFile
{
get{return formatoFile;}
}
public string Filename
{
get{return fileName;}
}
public bool SoloValidazione
{
get{return soloValidazione;}
}
#endregion
#region Methods
[Conditional("DEBUG")]
public void DumpOnTrace()
{
Trace.WriteLine(ProgramArgumentsUtil.ToString());
}
#endregion
}
class Program
{
/// <summary>
/// esempio: ASDataImp f:xls in:"C:\Data\Import Dati\ECMA.xls" m:v/i
/// </summary>
[STAThread]
static void Main(string[] args)
{
try
{
ProgramArguments arguments = ProgramArguments.FromCommandLineArguments();
arguments.DumpOnTrace();
switch(arguments.FormatoFile)
{
case FileFormats.XLS:
LettoreFoglioExcel excel = new LettoreFoglioExcel(arguments.Filename);
if(arguments.SoloValidazione)
{
excel.Valida();
}
else
{
excel.Importa();
}
break;
default:
throw new ArgumentException("Formato non valido", "formato");
}
}
catch(Exception e)
{
Environment.ExitCode = 1;
Console.WriteLine(e.ToString());
}
AttendiConfermaUtente();
}
[Conditional("DEBUG")]
private static void AttendiConfermaUtente()
{
Console.ReadLine();
}
}