private static void ValidateArguments(IEnumerable<CommandLineArgument> arguments)
{
List<string> knownAliases = new List<string>();
foreach (var argument in arguments)
{
foreach (var alias in argument.Aliases)
{
if (knownAliases.Contains(alias, new CaseAwareStringComparer(argument.IgnoreCase))) throw new InvalidArgDefinitionException("Duplicate alias '" + alias + "' on argument '" + argument.Aliases.First() + "'");
knownAliases.Add(alias);
}
}
foreach (var argument in arguments)
{
if (argument.ArgumentType == null)
{
throw new InvalidArgDefinitionException("Argument '" + argument.DefaultAlias + "' has a null ArgumentType");
}
if (argument.MustBeRevivable && ArgRevivers.CanRevive(argument.ArgumentType) == false)
{
throw new InvalidArgDefinitionException("There is no reviver for type '" + argument.ArgumentType.Name + '"');
}
if (argument.ArgumentType.IsEnum)
{
argument.ArgumentType.ValidateNoDuplicateEnumShortcuts(argument.IgnoreCase);
}
foreach (var property in argument.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
// Getting each property will result in all AttrOverrides being validated
try
{
var val = property.GetValue(argument, null);
}
catch(TargetInvocationException ex)
{
if (ex.InnerException is InvalidArgDefinitionException)
{
ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}
else
{
throw;
}
}
}
}
}