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)}"); } }