private static IEnumerable <ParameterInstances> GetArgumentsDefinitions(MethodInfo benchmark, Type target, SummaryStyle summaryStyle) { var argumentsAttributes = benchmark.GetCustomAttributes <PriorityAttribute>(); int priority = argumentsAttributes.Select(attribute => attribute.Priority).Sum(); var parameterDefinitions = benchmark.GetParameters() .Select(parameter => new ParameterDefinition(parameter.Name, false, Array.Empty <object>(), true, parameter.ParameterType, priority)) .ToArray(); if (parameterDefinitions.IsEmpty()) { yield return(new ParameterInstances(Array.Empty <ParameterInstance>())); yield break; } foreach (var argumentsAttribute in benchmark.GetCustomAttributes <ArgumentsAttribute>()) { if (parameterDefinitions.Length != argumentsAttribute.Values.Length) { throw new InvalidOperationException($"Benchmark {benchmark.Name} has invalid number of defined arguments provided with [Arguments]! {argumentsAttribute.Values.Length} instead of {parameterDefinitions.Length}."); } yield return(new ParameterInstances( argumentsAttribute .Values .Select((value, index) => { var definition = parameterDefinitions[index]; var type = definition.ParameterType; return new ParameterInstance(definition, Map(value, type), summaryStyle); }) .ToArray())); } if (!benchmark.HasAttribute <ArgumentsSourceAttribute>()) { yield break; } var argumentsSourceAttribute = benchmark.GetCustomAttribute <ArgumentsSourceAttribute>(); var valuesInfo = GetValidValuesForParamsSource(target, argumentsSourceAttribute.Name); for (int sourceIndex = 0; sourceIndex < valuesInfo.values.Length; sourceIndex++) { yield return(SmartParamBuilder.CreateForArguments(benchmark, parameterDefinitions, valuesInfo, sourceIndex, summaryStyle)); } }