正在访问.net表达式循环中的数组索引

本文关键字:数组 索引 循环 表达式 访问 net | 更新日期: 2023-09-27 18:28:56

我目前正忙于解决构建一个表达式树的问题,该表达式树验证数组中的多个参数
但是我不能使用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
                ));                    

正在访问.net表达式循环中的数组索引

嗯?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或其他什么?