8,497
社区成员
发帖
与我相关
我的任务
分享
static void Main(string[] args)
{
Expression<Func<int, int>> func2 = i => (new Func<int, int>(j => j + 1))(i) * (new Func<int, int>(j => j + 2))(i);
var argsExp = new ParameterExpression[] { Expression.Parameter(func2.Parameters[0].Type, "j") };
var binExp = func2.Body as BinaryExpression;
if (binExp != null)
{
Expression left = GetBlockExpression(binExp.Left),
right = GetBlockExpression(binExp.Right);
var newBodyExp = binExp.Update(left, null, right);
var newFunc = func2.Update(newBodyExp, argsExp);
Console.WriteLine(newFunc);
var funcTest = newFunc.Compile();
}
Console.Read();
}
static Expression GetBlockExpression(Expression part)
{
if (!(part is UnaryExpression))
{
var lambdaExp = part as LambdaExpression;
if (lambdaExp != null)
{
return lambdaExp.Body.Reduce();
}
var invokeExp = part as InvocationExpression;
if (invokeExp != null)
{
//如果是Lambda构建的委托调用
if (invokeExp.Expression.NodeType == ExpressionType.Lambda)
{
return GetBlockExpression(invokeExp.Expression);
}
return Expression.Block(invokeExp.Expression.Reduce());
}
throw new NotSupportedException(); /////////////////////////////
}
return part.Reduce();
}
static void Main(string[] args)
{
ParameterExpression i = Expression.Parameter(typeof(int), "i");
BinaryExpression i_add_1 = Expression.Add(i, Expression.Constant(1, typeof(int)));
BinaryExpression i_add_2 = Expression.Add(i, Expression.Constant(2, typeof(int)));
BinaryExpression i1_multiply_i2 = Expression.Multiply(i_add_1, i_add_2);
Expression<Func<int, int>> expression = Expression.Lambda<Func<int, int>>(i1_multiply_i2, i);
//输出测试
Console.WriteLine(expression.ToString());
}