private static ParameterFactoryFuncFormattableString GetFactory(FormattableString commandString) { if (ParameterFactoryCache.TryGet(commandString.Format, out var cachedFactory)) { return(cachedFactory); } var context = GetContext(); var factoryBodyExpressions = new List <Expression>(); var commandStringParamExpr = Expression.Parameter(typeof(FormattableString), "commandString"); var names = Enumerable.Range(0, commandString.ArgumentCount) .Select(x => $"@p__blazer__{x}") .ToArray(); var formattedCommandText = string.Format(commandString.Format, names); var commandTextAssignExpr = Expression.Assign( Expression.Property(context.CommandExpr, context.CommandCommandTextProperty), Expression.Constant(formattedCommandText)); factoryBodyExpressions.Add(commandTextAssignExpr); var namesVarExpr = Expression.Variable(typeof(string[]), "names"); var namesAssignExpr = Expression.Assign( namesVarExpr, Expression.Constant(names)); factoryBodyExpressions.Add(namesAssignExpr); var getArgumentMethod = typeof(FormattableString).GetMethod(nameof(FormattableString.GetArgument), FLAGS_PUBINST); for (int i = 0; i < commandString.ArgumentCount; i++) { var paramValueExpr = Expression.Call( commandStringParamExpr, getArgumentMethod, Expression.Constant(i)); var parameterValue = new ParameterExpressionFactory.ParameterValue { Name = names[i], ValueExpr = paramValueExpr, ValueType = commandString.GetArgument(i).GetType() }; factoryBodyExpressions.Add(ParameterExpressionFactory.GetExpression(context, parameterValue)); } var lambdaBlockExpr = Expression.Block( new[] { namesVarExpr }, factoryBodyExpressions); var lambdaExpr = Expression.Lambda <ParameterFactoryFuncFormattableString>(lambdaBlockExpr, context.CommandExpr, commandStringParamExpr); var lambda = lambdaExpr.Compile(); ParameterFactoryCache.Add(commandString.Format, lambda); return(lambda); }
private static ParameterFactoryFunc GetFactory(object parameters) { var parametersType = parameters.GetType(); if (ParameterFactoryCache.TryGet(parametersType, out ParameterFactoryFunc cachedFactory)) { return(cachedFactory); } var context = GetContext(); var factoryBodyExpressions = new List <Expression>(); var untypedParamsExpr = Expression.Parameter(typeof(object), "parameters"); var typedParamsVarExpr = Expression.Variable(parametersType); var typedParamsAssignExpr = Expression.Assign( typedParamsVarExpr, Expression.Convert(untypedParamsExpr, parametersType)); factoryBodyExpressions.Add(typedParamsAssignExpr); context.ParametersExpr = typedParamsVarExpr; foreach (var property in parametersType.GetProperties(FLAGS_PUBINST)) { factoryBodyExpressions.Add(ParameterExpressionFactory.GetExpression(context, property)); } var lambdaBlockExpr = Expression.Block( new[] { typedParamsVarExpr }, factoryBodyExpressions); var lambdaExpr = Expression.Lambda <ParameterFactoryFunc>(lambdaBlockExpr, context.CommandExpr, untypedParamsExpr); var lambda = lambdaExpr.Compile(); ParameterFactoryCache.Add(parametersType, lambda); return(lambda); }