-
Notifications
You must be signed in to change notification settings - Fork 14
/
ParameterizingExpressionVisitor.cs
37 lines (32 loc) · 1.09 KB
/
ParameterizingExpressionVisitor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Linq.Expressions;
using Remotion.Linq.Parsing;
namespace Simple1C.Impl.Queriables
{
internal class ParameterizingExpressionVisitor : RelinqExpressionVisitor
{
private int parameterIndex;
private ParameterExpression xParameter;
public Expression Parameterize(Expression expression, ParameterExpression xTargetParameter)
{
parameterIndex = 0;
xParameter = xTargetParameter;
return Visit(expression);
}
protected override Expression VisitConstant(ConstantExpression node)
{
return EmitParameterAccess(node.Type);
}
protected override Expression VisitMember(MemberExpression node)
{
return EmitParameterAccess(node.Type);
}
private Expression EmitParameterAccess(Type type)
{
var xArrayItem = Expression.ArrayIndex(xParameter, Expression.Constant(parameterIndex));
var result = Expression.Convert(xArrayItem, type);
parameterIndex++;
return result;
}
}
}