private static ParameterDefinitions GetParameterDefinitions(Type type) { IEnumerable <ParameterDefinition> GetDefinitions <TAttribute>(Func <TAttribute, Type, object[]> getValidValues) where TAttribute : Attribute { const BindingFlags reflectionFlags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; var allMembers = type.GetTypeMembersWithGivenAttribute <TAttribute>(reflectionFlags); return(allMembers.Select(member => new ParameterDefinition( member.Name, member.IsStatic, getValidValues(member.Attribute, member.ParameterType), false))); } var paramsDefinitions = GetDefinitions <ParamsAttribute>((attribute, parameterType) => GetValidValues(attribute.Values, parameterType)); var paramsSourceDefinitions = GetDefinitions <ParamsSourceAttribute>((attribute, _) => { var paramsValues = GetValidValuesForParamsSource(type, attribute.Name); return(SmartParamBuilder.CreateForParams(paramsValues.source, paramsValues.values)); }); var paramsAllValuesDefinitions = GetDefinitions <ParamsAllValuesAttribute>((_, paramaterType) => GetAllValidValues(paramaterType)); var definitions = paramsDefinitions.Concat(paramsSourceDefinitions).Concat(paramsAllValuesDefinitions).ToArray(); return(new ParameterDefinitions(definitions)); }
private static ParameterDefinitions GetParameterDefinitions(Type type) { const BindingFlags reflectionFlags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; var allParamsMembers = type.GetTypeMembersWithGivenAttribute <ParamsAttribute>(reflectionFlags); var allParamsSourceMembers = type.GetTypeMembersWithGivenAttribute <ParamsSourceAttribute>(reflectionFlags); var definitions = allParamsMembers .Select(member => new ParameterDefinition( member.Name, member.IsStatic, GetValidValues(member.Attribute.Values, member.ParameterType), false)) .Concat(allParamsSourceMembers.Select(member => { var paramsValues = GetValidValuesForParamsSource(type, member.Attribute.Name); return(new ParameterDefinition( member.Name, member.IsStatic, SmartParamBuilder.CreateForParams(paramsValues.source, paramsValues.values), false)); })) .ToArray(); return(new ParameterDefinitions(definitions)); }
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)); } }