示例#1
0
        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));
            }
        }