在 .net 表达式循环中访问数组索引
Accessing array index in .net expression loop
我目前一直在解决构建表达式树的问题,该表达式树可验证数组中的多个参数。
但是我不能使用 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
));
呃? Expression.ArrayAccess
的 "complicated" 是什么意思?您只需要 Expression.Assign(Expression.ArrayAccess(array, index), value)
。您的问题是将运行时数组与 "build" 时间数组混合在一起。
您可能根本不想使用 Expression.Loop
,因为您需要迭代不是数组的内容。相反,只需构建一个简单的表达式块:
Expression.Block
(
param.Select
(
(item, index) =>
Expression.Assign(item, Expression.Constant(inParams[index]))
)
);
就是说,我不确定您要对参数做什么 "assigning"。也许您正在尝试使用 Expression.Variable
代替什么?
我目前一直在解决构建表达式树的问题,该表达式树可验证数组中的多个参数。
但是我不能使用 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
));
呃? Expression.ArrayAccess
的 "complicated" 是什么意思?您只需要 Expression.Assign(Expression.ArrayAccess(array, index), value)
。您的问题是将运行时数组与 "build" 时间数组混合在一起。
您可能根本不想使用 Expression.Loop
,因为您需要迭代不是数组的内容。相反,只需构建一个简单的表达式块:
Expression.Block
(
param.Select
(
(item, index) =>
Expression.Assign(item, Expression.Constant(inParams[index]))
)
);
就是说,我不确定您要对参数做什么 "assigning"。也许您正在尝试使用 Expression.Variable
代替什么?