Пример #1
0
        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);
        }
Пример #2
0
        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);
        }