/// <summary>
        /// Process expression result for compiling
        /// </summary>
        /// <param name="expressionContext"></param>
        /// <param name="parameters"></param>
        /// <param name="extraExpressions"></param>
        /// <returns></returns>
        protected virtual Expression ProcessExpressionResultForCompile(IActivationExpressionResult expressionContext,
                                                                       out ParameterExpression[] parameters, out Expression[] extraExpressions)
        {
            if (expressionContext.Request.InjectionContextRequired())
            {
                AddInjectionContextExpression(expressionContext);
            }

            var finalExpression = expressionContext.Expression;

            if (!finalExpression.Type.IsByRef)
            {
                finalExpression = Expression.Convert(finalExpression, typeof(object));
            }

            if (finalExpression.NodeType == ExpressionType.Convert &&
                !expressionContext.Expression.Type.GetTypeInfo().IsValueType)
            {
                finalExpression = ((UnaryExpression)finalExpression).Operand;
            }

            parameters       = expressionContext.ExtraParameters().ToArray();
            extraExpressions = expressionContext.ExtraExpressions().ToArray();

            return(finalExpression);
        }
        /// <summary>
        /// Compiles an expression result to a delegate
        /// </summary>
        /// <param name="expressionContext"></param>
        /// <param name="parameters"></param>
        /// <param name="extraExpressions"></param>
        /// <param name="finalExpression"></param>
        /// <returns></returns>
        protected virtual ActivationStrategyDelegate CompileExpressionResultToDelegate(
            IActivationExpressionResult expressionContext, ParameterExpression[] parameters, Expression[] extraExpressions,
            Expression finalExpression)
        {
            Expression compileExpression;

            if (parameters.Length == 0 &&
                extraExpressions.Length == 0)
            {
                compileExpression = finalExpression;
            }
            else
            {
                var list = new List <Expression>(expressionContext.ExtraExpressions())
                {
                    finalExpression
                };

                compileExpression = Expression.Block(expressionContext.ExtraParameters(), list);
            }

            var compiled =
                Expression.Lambda <ActivationStrategyDelegate>(compileExpression,
                                                               expressionContext.Request.Constants.ScopeParameter,
                                                               expressionContext.Request.Constants.RootDisposalScope,
                                                               expressionContext.Request.Constants.InjectionContextParameter).Compile();

            return(compiled);
        }
        //TODO: Typo in method name.
        protected virtual T CompileExpressionResultToOpitimzed <T>(
            IActivationExpressionResult expressionContext, ParameterExpression[] parameters, Expression[] extraExpressions,
            Expression finalExpression)
        {
            Expression compileExpression;

            if (parameters.Length == 0 &&
                extraExpressions.Length == 0)
            {
                compileExpression = finalExpression;
            }
            else
            {
                var list = new List <Expression>(expressionContext.ExtraExpressions())
                {
                    finalExpression
                };

                compileExpression = Expression.Block(expressionContext.ExtraParameters(), list);
            }

            var parameterList = new List <ParameterExpression>();

            var invokeMethod   = typeof(T).GetTypeInfo().GetDeclaredMethod("Invoke");
            var parameterInfos = invokeMethod.GetParameters();

            if (parameterInfos.Length > 3)
            {
                throw new Exception("Delegate type not supported: " + typeof(T).Name);
            }

            if (parameterInfos.Length > 0)
            {
                parameterList.Add(expressionContext.Request.Constants.ScopeParameter);
            }

            if (parameterInfos.Length > 1)
            {
                parameterList.Add(expressionContext.Request.Constants.RootDisposalScope);
            }

            if (parameterInfos.Length > 2)
            {
                parameterList.Add(expressionContext.Request.Constants.InjectionContextParameter);
            }

            var compiled =
                Expression.Lambda <T>(compileExpression, parameterList).Compile();

            return(compiled);
        }
Exemple #4
0
 /// <summary>
 /// Add child expression result
 /// </summary>
 /// <param name="result">expression result</param>
 public void AddExpressionResult(IActivationExpressionResult result)
 {
     _extraExpressions     = _extraExpressions.AddRange(result.ExtraExpressions());
     _parameterExpressions = _parameterExpressions.AddRange(result.ExtraParameters());
 }