示例#1
0
        public Handler BuildCSharpHandler(string assemblyName, HandlerInfo info,
                                          DelegateBuildStrategy strategy = DelegateBuildStrategy.MethodInfo, params Assembly[] dependencies)
        {
            var type       = BuildType(assemblyName, info, dependencies);
            var function   = info.Function ?? "Execute";
            var methodInfo = type?.GetMethod(function, BindingFlags.Public | BindingFlags.Static);

            return(methodInfo == null ? null : FromMethod(type, methodInfo, strategy));
        }
示例#2
0
        public Handler GetOrCacheHandlerFromMethod(Type type, MethodInfo methodInfo, DelegateBuildStrategy strategy)
        {
            var key = new MethodAndStrategy(methodInfo, strategy);

            if (!_handlers.TryGetValue(key, out var handler))
            {
                _handlers[key] = handler = FromMethod(type, methodInfo, strategy);
            }
            return(handler);
        }
示例#3
0
        private void BenchStrategy(Stopwatch sw, int trials, DelegateBuildStrategy strategy, HandlerInfo info)
        {
            var noArgs = new object[] { };
            var d      = _fixture.Factory.BuildCSharpHandler($"{Guid.NewGuid()}.dll", info, strategy);

            sw.Restart();
            for (var i = 0; i < trials; i++)
            {
                Assert.Equal("Hello, World!", d.DynamicInvoke(null, noArgs));
            }
            _console.WriteLine($"{strategy} {trials}x took {sw.Elapsed}");
        }
示例#4
0
        public Handler BuildCSharpHandler(string assemblyName, HandlerInfo info, DelegateBuildStrategy strategy = DelegateBuildStrategy.MethodInfo, params Assembly[] dependencies)
        {
            var type       = BuildType(assemblyName, info, dependencies);
            var function   = info.Function ?? "Execute";
            var methodInfo = type?.GetMethod(function, BindingFlags.Public | BindingFlags.Static);

            if (methodInfo == null)
            {
                return(null);
            }

            switch (strategy)
            {
            case DelegateBuildStrategy.MethodInfo:
            {
                return((t, p) => methodInfo.Invoke(t, p));
            }

            case DelegateBuildStrategy.Expression:
            {
                var parameters = methodInfo.GetParameters();
                var arguments  = parameters.Select(x => Expression.Parameter(x.ParameterType, x.Name)).ToList();
                var methodCall = Expression.Call(methodInfo.IsStatic ? null : Expression.Parameter(typeof(object), "instance"), methodInfo, arguments);
                var lambda     = Expression.Lambda(Expression.Convert(methodCall, typeof(object)), arguments);
                var d          = lambda.Compile();
                return(methodInfo.IsStatic
                                                ? (Handler)((t, p) => d.DynamicInvoke(p))
                                                : (t, p) => d.DynamicInvoke(t, p));
            }

            case DelegateBuildStrategy.ObjectExecutor:
            {
                var executor = ObjectMethodExecutor.Create(methodInfo, type.GetTypeInfo());
                return((t, p) => executor.Execute(t, p));
            }

            default:
                throw new ArgumentOutOfRangeException(nameof(strategy), strategy, null);
            }
        }
示例#5
0
        public static Handler FromMethod(Type type, MethodInfo methodInfo, DelegateBuildStrategy strategy)
        {
            Contract.Assert(methodInfo != null);
            Contract.Assert(type != null);

            switch (strategy)
            {
            case DelegateBuildStrategy.MethodInfo:
            {
                return(methodInfo.Invoke);
            }

            case DelegateBuildStrategy.Expression:
            {
                var parameters = methodInfo.GetParameters();
                var arguments  = parameters.Select(x => Expression.Parameter(x.ParameterType, x.Name)).ToList();
                var methodCall =
                    Expression.Call(methodInfo.IsStatic ? null : Expression.Parameter(typeof(object), "instance"),
                                    methodInfo, arguments);
                var lambda = Expression.Lambda(Expression.Convert(methodCall, typeof(object)), arguments);
                var d      = lambda.Compile();
                return(methodInfo.IsStatic
                        ? (Handler)((t, p) => d.DynamicInvoke(p))
                        : (t, p) => d.DynamicInvoke(t, p));
            }

            case DelegateBuildStrategy.ObjectExecutor:
            {
                var executor = ObjectMethodExecutor.Create(methodInfo, type.GetTypeInfo());
                return((t, p) => executor.Execute(t, p));
            }

            default:
                throw new ArgumentOutOfRangeException(nameof(strategy), strategy, null);
            }
        }
示例#6
0
 public MethodAndStrategy(MethodInfo methodInfo, DelegateBuildStrategy strategy)
 {
     _methodInfo = methodInfo;
     _strategy   = strategy;
 }