internal AttributeConfiguration(IServiceProvider serviceProvider, IEnumerable <Type> optionTypes, object?instance = null) { _serviceProvider = serviceProvider; foreach (var type in optionTypes) { var typeInfo = type.GetTypeInfo(); foreach (var methodVerbPair in typeInfo.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static).Select((x) => new KeyValuePair <MethodInfo, IVerb?>(x, GetVerbFromMethod(x))).Where((x) => x.Value != null)) { var parameterOptions = new List <IParameterValue>(); foreach (var parameter in methodVerbPair.Key.GetParameters()) { var option = AttributeHandler.GetOption(this, methodVerbPair.Key.ToString(), parameter); if (option == null) { if (parameter.HasDefaultValue) { parameterOptions.Add(new DefaultValueParameter(parameter)); } else { throw new InvalidOperationException($"The parameter \"{parameter.Name}\" on \"{methodVerbPair.Key.DeclaringType.FullName + ":" + methodVerbPair.Key.Name}\" for the verb \"{methodVerbPair.Value.Name}\" has neither an option, nor a default value."); } } else { parameterOptions.Add(new ParameterValueOption(parameter, option, methodVerbPair.Key)); } } _verbData.Add(methodVerbPair.Value, new VerbData(methodVerbPair.Value, methodVerbPair.Key, () => { if (instance != null) { return(instance); } return(AttributeHandler.GetConstructor(typeInfo).Invoke(new object[0])); }, parameterOptions)); } } }
internal AttributeConfiguration(IServiceProvider serviceProvider, IEnumerable <Type> optionTypes) { _serviceProvider = serviceProvider; foreach (var type in optionTypes) { var typeInfo = type.GetTypeInfo(); var verb = GetVerbFromType(type); //get options var options = new List <OptionProperty>(); foreach (var property in typeInfo.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { var option = AttributeHandler.GetOption(this, type.Name, property); if (option != null) { options.Add(new OptionProperty(option, property)); } } _verbsData.Add(verb, new VerbData(verb, () => AttributeHandler.GetConstructor(typeInfo).Invoke(new object[0]), options)); } }