Доступ к индексу массива в цикле выражения.net

В настоящее время я застрял в решении проблемы построения дерева выражений, которое проверяет множество аргументов из массива.
Но я не могу использовать Expression.Loop для перебора всех элементов входного массива. Потому что я не знаю, как преобразовать переменную count в int.
Я пытался использовать ArrayAccess, но это довольно сложно.
Большое спасибо.
Вот мой код:

//array stores temp input. inputCount is a dynamic value that got from the argument
object[] inParams = new object[inputCount];
var breakLabel = Expression.Label("LoopBreak");
//input of parameters to pass in the expression
ParameterExpression[] param = new ParameterExpression[inputCount];
            for (int i = 0; i < inputCount; i++)
            {                
                param[i] = Expression.Parameter(inParams[i].GetType(), "randomname");
//count variable for indexer
ParameterExpression count = Expression.Parameter(typeof(int), "count");
            }
BlockExpression block2 = Expression.Block(
                new[] { count },
                Expression.Assign(count, Expression.Constant(0)),
                Expression.Loop(
                    Expression.IfThenElse(
                            Expression.LessThan(count, Expression.Constant(param.Count())),                            
                            Expression.Block(
//Assign param[count] element from inParams[count] element
                                Expression.Assign(param[count], Expression.Constant(inParams[count])),
                                Expression.PostIncrementAssign(count)
                                ),
                            Expression.Break(breakLabel)
                    ),
                    breakLabel
                ));                    

1 ответ

Решение

Э-э? Что "сложного" в Expression.ArrayAccess? Все, что тебе нужно Expression.Assign(Expression.ArrayAccess(array, index), value), Ваша проблема - смешивать массивы времени выполнения с массивами времени сборки.

Вы, вероятно, не хотите использовать Expression.Loop вообще, так как вам нужно перебирать что-то, что не является массивом. Вместо этого просто создайте простой блок выражений:

Expression.Block
(
  param.Select
  (
    (item, index) =>
    Expression.Assign(item, Expression.Constant(inParams[index]))
  )
);

Тем не менее, я не уверен, что вы пытаетесь сделать "назначение" параметра. Может быть, вы пытаетесь использовать Expression.Variable вместо чего-то?

Другие вопросы по тегам