/// <summary> /// Handles any defined global parameter that has any input /// </summary> private void HandleDefinedGlobals(Dictionary <string, string> args, object obj) { var globals = GetDefinedGlobals(); foreach (var method in globals) { var att = method.GetAttribute <GlobalAttribute>(); var name = att.Name ?? method.Name; var allNames = new[] { name }.Union(att.Aliases.CommaSplit()); var key = args.Keys.FirstOrDefault( k => allNames.Any( n => n.Equals(k, StringComparison.InvariantCultureIgnoreCase))); if (key != null) { var parameters = method.GetParameters(); if (parameters.Length == 0) { MethodInvoker.Invoke(method, obj, null); } else if (parameters.Length == 1) { string stringValue; if (args.TryGetValue(key, out stringValue)) { var p = parameters.First(); var value = ValuesFactory.GetValueForParameter(p, p.ParameterType, key, stringValue); // validation // if (value != null && p.HasAttribute <ValidationAttribute>()) { var parameterValidators = p.GetAttributes <ValidationAttribute>().Select(a => a.GetValidator()); // all validators must pass // foreach (var validator in parameterValidators) { validator.Validate(new ValueInfo(p.Name, p.ParameterType, value)); } } var validators = method.GetInterfaceAttributes <ICollectionValidation>(). Select(a => a.GetValidator()); foreach (var validator in validators) { validator.Validate(new[] { new ValueInfo(p.Name, p.ParameterType, value), }); } MethodInvoker.Invoke(method, obj, new[] { value }); } } else { throw new NotSupportedException( "Method {0} has more than one parameter and cannot be handled as a global handler".FormatWith(method.Name)); } // remove it so later we'll see which ones were not handled // args.Remove(key); } } }