private static void ParseRequiredParameters <TOptions>(string[] args, int offsetInArray, ArgumentGroupInfo TypeArgumentInfo, TOptions options, ref int currentLogicalPosition) where TOptions : new() { if (args.Length == 0) { throw new ArgumentException("Required parameters have not been specified"); } int matchedRequiredParameters = 0; do { //set the required property PropertyInfo propInfo; if (!TypeArgumentInfo.RequiredArguments.TryGetValue(currentLogicalPosition, out propInfo)) { break; } //make sure that we don't run out of array if (offsetInArray + currentLogicalPosition >= args.Length) { throw new ArgumentException("Required parameters have not been specified"); } var value = PropertyHelpers.GetValueFromArgsArray(args, offsetInArray, ref currentLogicalPosition, propInfo); propInfo.SetValue(options, value); matchedRequiredParameters++; } while (currentLogicalPosition < args.Length); // no more? do we have any properties that we have not yet set? if (TypeArgumentInfo.RequiredArguments.Count != matchedRequiredParameters) { throw new ArgumentException("Not all required arguments have been specified"); } }
private static List <PropertyInfo> ParseOptionalParameters <TOptions>(string[] args, int offsetInArray, ArgumentGroupInfo TypeArgumentInfo, TOptions options, ref int currentLogicalPosition) where TOptions : new() { // we are going to assume that all optionl parameters are not matched to values in 'args' List <PropertyInfo> unmatched = new List <PropertyInfo>(TypeArgumentInfo.OptionalArguments.Values); // process the optional arguments while (offsetInArray + currentLogicalPosition < args.Length) { if (args[offsetInArray + currentLogicalPosition][0] != '-') { throw new ArgumentException("Optional parameter name should start with '-'"); } PropertyInfo optionalProp = null; var optionalParamName = args[offsetInArray + currentLogicalPosition].Substring(1); if (!TypeArgumentInfo.OptionalArguments.TryGetValue(optionalParamName, out optionalProp)) { throw new ArgumentException($"Could not find argument {args[currentLogicalPosition]}"); } // skip over the parameter name currentLogicalPosition++; var value = PropertyHelpers.GetValueFromArgsArray(args, offsetInArray, ref currentLogicalPosition, optionalProp); optionalProp.SetValue(options, value); unmatched.Remove(optionalProp); } return(unmatched); }