使用System.Linq.Expressions跨越对象[C#]数组中的元组



假设我有一个类似的方法

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>,因此可以从Item1Item2字段中获取值。其基本思想是将方法return分配给一个变量,并获得Item1Item2字段。

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);

最新更新