Я пытаюсь создать дерево выражений, которое будет генерировать этот метод:
public static int Print(int i) {
int cnt = 0;
int sum = 0;
while (true) {
if (cnt >= i) {
Console.WriteLine(sum);
break;
}
sum = sum + cnt;
cnt++;
}
return sum;
}
Я не понимаю, как работает LabelTarget
. В моем случае нет значения, к которому я хочу перейти ... Я не понимаю, почему для этого требуется type
.
Вот мой код:
public static Func<int,int> MakeExpression() {
//input
ParameterExpression parameter = Expression.Parameter(typeof(int));
//define local variables and initialize them
Expression cntVarExpr = Expression.Variable(typeof(int),"cnt");
Expression sumVarExpr = Expression.Variable(typeof(int), "sum");
Expression initCntExpr = Expression.Assign(cntVarExpr, Expression.Constant(0));
Expression initSumExpr = Expression.Assign(sumVarExpr, Expression.Constant(0));
//loop condition
Expression condExpr = Expression.GreaterThanOrEqual(cntVarExpr, parameter);
//block if true
MethodInfo method = typeof(Console).GetMethod("WriteLine",new Type[] { typeof(int)});
Expression printExpr = Expression.Call(null, method,cntVarExpr); //static method
LabelTarget label = Expression.Label(typeof(int)); //am not sure about this one ? what
Expression bkExpr = Expression.Break(label, sumVarExpr);
BlockExpression block = Expression.Block(printExpr, bkExpr);
//loop body
Expression ifExpr = Expression.IfThen(condExpr, block);
Expression addExpr = Expression.AddAssign(sumVarExpr,cntVarExpr);
Expression incrExpr = Expression.Add(cntVarExpr, Expression.Constant(1));
BlockExpression loopBodyExpr = Expression.Block(ifExpr, addExpr,incrExpr);
LoopExpression loopExpr = Expression.Loop(loopBodyExpr);
//method body
Expression returnExpr = Expression.Return(label, sumVarExpr,typeof(int));
//final expression
BlockExpression bigExpression = Expression.Block(initCntExpr, initSumExpr, loopExpr, returnExpr);
var meth = Expression.Lambda<Func<int, int>>(bigExpression,parameter).Compile();
return meth;
}
Я получаю эту ошибку:
'variable 'cnt' of type 'System.Int32' referenced from scope '', but it is not defined'