Ecco un'alternativa, con il rovescio della medaglia che si deve ridichiarare le costanti valore di default:
CreateTaskGroup(
args[0],
args.ElementAtOrDefault(1) ?? "en-us",
args.ElementAtOrDefault(2) ?? "MyProject",
args.ElementAtOrDefault(3) ?? "DefaultTeam",
args.ElementAtOrDefault(4) ?? "abc");
È possibile ridurre questo problema dichiarando le stringhe come const
s, ad esempio:
public const string MarketDefault = "en-us";
public static int CreateTaskGroup(string TaskGroupName,
string Market = MarketDefault, ...)
static void Main(string[] args)
{
CreateTaskGroup(
args[0],
args.ElementAtOrDefault(1) ?? MarketDefault,
...);
}
Ma poi non è garantito dal compilatore, né apertamente ovvio, che MarketDefault
sia, in effetti, ancora (il codice può essere refactored in futuro) il default per Market
.
Edit: Ecco una soluzione alternativa, utilizzando la riflessione:
var argsForMethod = new List<string>(args);
var m = typeof(Program).GetMethod("CreateTaskGroup");
foreach (var p in m.GetParameters().Skip(args.Length))
if (p.Attributes.HasFlag(ParameterAttributes.HasDefault))
argsForMethod.Add((string)p.DefaultValue);
else
throw new NotImplementedException();
var result = (int)m.Invoke(null, argsForMethod.ToArray());
Questo può essere un po 'difficile da leggere, e non sarà troppo veloce, ma fa quello che hai chiesto, senza ricorrere a codice ripetitivo , o con incertezza sul valore predefinito dei parametri. Probabilmente vorrai aggiungere qualche gestione degli errori per troppi pochi o troppi parametri. Preferisco questa soluzione.
See questa domanda simile: http://stackoverflow.com/questions/1996426/pass-multiple-optional-parameters-to-ac-sharp-function – Wug
i parametri sono sempre nello stesso ordine? – blitzen
@Wug, non credo che la domanda sia abbastanza simile da essere utile all'OP.(a meno che l'OP non voglia rendere il suo metodo molto meno leggibile) –