public void WriteExpressions(LambdaDefinition definition) { var scope = definition.Scope(); var closedMethod = _openMethod.MakeGenericMethod(_serviceType); var expr = definition.ExpressionFor(Variable); var call = Expression.Call(scope, closedMethod); var assign = Expression.Assign(expr, call); definition.Body.Add(assign); if (Next == null) { definition.Body.Add(expr); } else if (Next is IResolverFrame next) { next.WriteExpressions(definition); } else { throw new InvalidCastException($"{Next.GetType().FullNameInCode()} does not implement {nameof(IResolverFrame)}"); } }
public void WriteExpressions(LambdaDefinition definition) { var scope = definition.Scope(); var variableExpr = Expression.Variable(Variable.VariableType, Variable.Usage); definition.RegisterExpression(Variable, variableExpr); var invokeMethod = _setter.InitialValue.GetType().GetMethod("Invoke"); var invoke = Expression.Call(Expression.Constant(_setter.InitialValue), invokeMethod, scope); Expression cast = invoke; if (!variableExpr.Type.IsAssignableFrom(invoke.Type)) { cast = Expression.Convert(invoke, variableExpr.Type); } definition.Body.Add(Expression.Assign(variableExpr, cast)); if (!Variable.VariableType.IsValueType) { definition.TryRegisterDisposable(variableExpr); } if (Next is IResolverFrame next) { next.WriteExpressions(definition); } else { throw new InvalidCastException($"{Next.GetType().FullNameInCode()} does not implement {nameof(IResolverFrame)}"); } }
public void WriteExpressions(LambdaDefinition definition) { var scope = definition.Scope(); var expr = definition.ExpressionFor(Variable); var instance = Variable.Instance; var @call = Expression.Call(Expression.Constant(instance), _resolveMethod, scope); var assign = Expression.Assign(expr, Expression.Convert(@call, Variable.VariableType)); definition.Body.Add(assign); if (Next is IResolverFrame next) { next.WriteExpressions(definition); } else { throw new InvalidCastException($"{Next.GetType().GetFullName()} does not implement {nameof(IResolverFrame)}"); } }