【发布时间】:2014-05-26 03:30:59
【问题描述】:
假设我有以下内容。
foreach (var loop in helper.Loop(x => x.LoopItems))
{
loop.Text(x => x.Name);
loop.Span(x => x.Name);
foreach (var loopItem in loop.Loop(x => x.NestedLoopItems))
{
loopItem.Text(x => x.Age);
}
}
这仅适用于我当前的实现,但是它必须编译内部 lambda 表达式的次数与循环项的次数一样多。目前,这样做是为了创建表达式以访问List<T> 索引器。例如。 x.ListItems[i]
var methodCallExpression = Expression.Call(_expression, ((PropertyInfo) _expression.Member).PropertyType.GetMethod("get_Item"), Expression.Constant(i));
var expression = Expression.Lambda<Func<TModel, T>>(methodCallExpression, _expression.GetParameter<TModel>());
然后就可以了
var newExpression = CombineExpression(listExpression);
var enumerable = newExpression.Compile().Invoke(_htmlHelper.ViewData.Model);
编译步骤似乎是昂贵的一步。
考虑到它需要为每个循环创建一个新循环,是否有任何方法可以缓存它,这样Expression.Constant(i) 中的i 需要在每次修改表达式时递增。
【问题讨论】:
标签: c# linq lambda expression