/// <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); }
/// <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()); }