如何使用表达式树调用具有引用变量的方法
本文关键字:引用 变量 方法 何使用 表达式 调用 | 更新日期: 2023-09-27 18:00:02
我正试图弄清楚如何创建一个表达式,该表达式调用一个具有引用参数的方法。
让我用一个简单(但人为)的例子来解释我的问题。考虑方法:
public static int TwiceTheInput(int x)
{
return x*2;
}
我可以创建一个表达式来调用上面的方法,方法如下:
{
var inputVar = Expression.Variable(typeof (int), "input");
var blockExp =
Expression.Block(
new[] {inputVar}
, Expression.Assign(inputVar, Expression.Constant(10))
, Expression.Assign(inputVar, Expression.Call(GetType().GetMethod("TwiceTheInput", new[] { typeof(int) }), inputVar))
, inputVar
);
var result = Expression.Lambda<Func<int>>(blockExp).Compile()();
}
在执行时,上面的"结果"应该以值20结束。现在考虑TwiceTheInput()的一个版本,该版本通过引用使用以下参数:
public static void TwiceTheInputByRef(ref int x)
{
x = x * 2;
}
如何编写类似的表达式树来调用TwiceTheInputByRef()并通过引用传递参数?
解决方案:(感谢Cicada)。用途:
Type.MakeByRefType()
以下是生成表达式树的代码段:
{
var inputVar = Expression.Variable(typeof(int), "input");
var blockExp =
Expression.Block(
new[] { inputVar }
, Expression.Assign(inputVar, Expression.Constant(10))
, Expression.Call(GetType().GetMethod("TwiceTheInputByRef", new[] { typeof(int).MakeByRefType() }), inputVar)
, inputVar
);
var result = Expression.Lambda<Func<int>>(blockExp).Compile()();
}
您不需要做太多更改,只需删除Assign
并将typeof(int)
更改为typeof(int).MakeByRefType()
即可。
var blockExp = Expression.Block(
new[] { inputVar }
, Expression.Assign(inputVar, Expression.Constant(10))
, Expression.Call(
typeof(Program).GetMethod(
"TwiceTheInputByRef", new [] { typeof(int).MakeByRefType() }),
inputVar)
, inputVar
);