假设我有一个类似的方法
public static int Sum(int a, int b)
{
return a + b;
}
我需要构造一个表达式,以便新方法必须以new object[1]{Sum(a, b);}
的形式返回,为此我使用以下代码:
var callMethod = Expression.Call(mi, parameters);
// new object[] { Sum((a, b) }
var returnResult = Expression.NewArrayInit(
typeof(object),
Expression.Convert(callMethod, typeof(object)));
其中CCD_ 2是通过反射获得的求和方法。
现在,我需要扩展表达式的生成,以将元组作为输出参数进行管理,并且元组的结果必须跨越到结果数组中。。实际上,我想做的是转换这种方法
public static (int result, bool isOverflowed) Sum(int a, int b)
{
return (a + b, false);
}
进入这个:
var callMethod = Expression.Call(mi, parameters);
// new object[] { Sum((a, b) }
var returnResult = Expression.NewArrayInit(
typeof(object),
Expression.Convert(Tuple1, typeof(object)), // The desired
Expression.Convert(Tuple2, typeof(object))); // The desired
如何做到这一点?
由于该方法将返回ValueTuple<int, bool>
,因此可以从Item1
和Item2
字段中获取值。其基本思想是将方法return分配给一个变量,并获得Item1
和Item2
字段。
var mi = typeof(Program).GetMethod("Sum");
var parameters = new ParameterExpression[]{ Expression.Parameter(typeof(int)), Expression.Parameter(typeof(int)) };
var callMethod = Expression.Call(mi, parameters);
var variable = Expression.Variable(typeof(ValueTuple<int, bool>));
var assign = Expression.Assign(variable, callMethod);
var returnResult = Expression.NewArrayInit(typeof(object),
Expression.Convert(Expression.Field(variable, "Item1"), typeof(object)),
Expression.Convert(Expression.Field(variable, "Item2"), typeof(object)));
var block = Expression.Block(new ParameterExpression[] { variable }, assign, returnResult);
var x = Expression.Lambda(block, parameters).Compile().DynamicInvoke(1 , 2);