Updated Question Further Down
I\'ve been experimenting with expression trees in .NET 4 to generate code at runtime and I\'ve been trying to implement th
You problem is that you didn't pass parameters and variables to your block expression. You use them in the "inner" expressions, but the block expression knows nothing about them. Basically, all you need to do is to pass all your parameters and variables to a block expression.
var @foreach = Expression.Block(
new ParameterExpression[] { item, enumerator, param },
assignToEnum,
Expression.Loop(
Expression.IfThenElse(
Expression.NotEqual(doMoveNext, Expression.Constant(false)),
assignCurrent,
Expression.Break(@break))
, @break)
);
Don't forget to dispose IEnumerator in try/finally - lots of code (such as File.ReadLines()) depends on that.
Sorry if this is thread necromancy, but in case other people are running into the same or similar problem:
You can try to write an ExpressionVisitor that replaces a parameter with the same name and type in the external body expression with the variable parameter you have declared when creating the block expression. That way the parameter in the body will be the same object as the parameter in the block declaration and so the LambdaExpression should compile.