Exemplo n.º 1
0
        public void Should_invoke_method_faster_than_reflection()
        {
            var iterations = 10000;
            var type       = new TypeCache().GetTypeDescriptor(typeof(InvokerMethods));
            var method     = type.Methods.FirstOrDefault(x =>
                                                         x.Name == nameof(InvokerMethods.MethodWithReturnAndParameters));

            var invoke     = method.GenerateAsyncInvoker(type);
            var instance   = new InvokerMethods();
            var parameters = new object[] { "param1", "param2" };

            var nativeElapsed     = new List <long>();
            var reflectionElapsed = new List <long>();
            var expressionElapsed = new List <long>();

            iterations.Times(() =>
            {
                expressionElapsed.Add(instance.ElapsedTicks(x => invoke(x, parameters)));
                reflectionElapsed.Add(method.ElapsedTicks(x => x.MethodInfo.Invoke(instance, parameters)));
                nativeElapsed.Add(instance.ElapsedTicks(x => x.MethodWithReturnAndParameters(
                                                            (string)parameters[0], (string)parameters[1])));
            });

            Console.WriteLine($"Native:              {nativeElapsed.Average()}");
            Console.WriteLine($"Compiled expression: {expressionElapsed.Average()}");
            Console.WriteLine($"Reflection:          {reflectionElapsed.Average()}");
        }
Exemplo n.º 2
0
        public async Task Should_throw_informative_message_when_argument_cannot_be_cast_to_parameter_type()
        {
            var type   = new TypeCache().GetTypeDescriptor(typeof(InvokerMethods));
            var method = type.Methods.FirstOrDefault(x =>
                                                     x.MethodInfo.Name == nameof(InvokerMethods.MethodWithNonNullableParameter));
            var invoker  = method.GenerateAsyncInvoker(type);
            var instance = new InvokerMethods();

            var message = invoker.Should().Throw <ParameterInvalidCastException>(
                async x => await invoker(instance, new object[] { "fark" })).Result.Message;

            message.ShouldContain("param");
            message.ShouldContain("String");
            message.ShouldContain("Int32");
        }
Exemplo n.º 3
0
        public async Task Should_invoke_method(LambdaExpression expression,
                                               object[] parameters, object response)
        {
            var type   = new TypeCache().GetTypeDescriptor(typeof(InvokerMethods));
            var method = type.Methods.FirstOrDefault(x =>
                                                     x.MethodInfo == expression.GetMethodInfo());
            var invoker  = method.GenerateAsyncInvoker(type);
            var instance = new InvokerMethods();

            var result = await invoker(instance, parameters);

            instance.CalledMethod.ShouldEqual(method.Name);
            if (parameters != null)
            {
                instance.Params.ShouldOnlyContain(parameters);
            }
            result.ShouldEqual(response);
        }
Exemplo n.º 4
0
        public void Should_invoke_method_faster_than_reflection()
        {
            var type       = new TypeCache().GetTypeDescriptor(typeof(InvokerMethods));
            var method     = type.Methods.First(x => x.Name == nameof(InvokerMethods.MethodWithReturnAndParameters));
            var invoke     = method.GenerateAsyncInvoker(type);
            var instance   = new InvokerMethods();
            var parameters = new object[] { "param1", "param2" };

            var comparison = PerformanceComparison.InTicks(10000, 1000);

            comparison.AddCase("Native", () => instance
                               .MethodWithReturnAndParameters((string)parameters[0], (string)parameters[1]));

            var compiledCase   = comparison.AddCase("Compiled expression", () => invoke(instance, parameters));
            var reflectionCase = comparison.AddCase("Reflection", () => method.MethodInfo.Invoke(instance, parameters));

            comparison.Run();

            compiledCase.Average.ShouldBeLessThan(reflectionCase.Average);
        }