I can't answer this question completely, but can probably help nudge you along with it.
Firstly this line:
var lambda = FastExpressionCompiler.LightExpression.Expression.Lambda<Func<FieldInfo<TUserData, TValue>>>(body, tiExp, piExp, attrExp, indexExp).CompileFast();
'var' sometimes hides things a bit, and its clearer when you specify the type explicitly:
Func<FieldInfo<TUserData, TValue>> lambda = FastExpressionCompiler.LightExpression.Expression.Lambda<Func<FieldInfo<TUserData, TValue>>>(body, tiExp, piExp, attrExp, indexExp).CompileFast();
So, here lambda is a delegate which returns a FieldInfo<t1,t2> but takes
no parameters, which is why you are getting parameter mismatch exceptions. I think what you need is:
var lambda = FastExpressionCompiler.LightExpression.Expression.Lambda<Func<TableInfo, PropertyInfo, FieldAttribute, int, FieldInfo<TUserData, TValue>>>(body, tiExp, piExp, attrExp, indexExp).CompileFast();
Now, when I tried that the parameter count mismatch went away but got an 'invalid program' error instead which is about the worst possible error I can think of. I had a hunch that it was to do with the last byref parameter, so I changed it not be a 'ref int' and just an 'int' and then sure enough I could create the objects in the loop.
I then realised that I'd never seen a ref in a Func before, and have concluded I'd have to sit down and think about that quite a lot. Is it rare or impossible? So two issues, the Func<> wasn't declared right and the byref needs some thought...