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)); }
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); }
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}"); }
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); } }
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); } }
public MethodAndStrategy(MethodInfo methodInfo, DelegateBuildStrategy strategy) { _methodInfo = methodInfo; _strategy = strategy; }