Example #1
0
        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)}");
            }
        }