How to call methods with reference variables with expression trees

I am trying to figure out how to create an expression that calls a method that has a reference parameter.

Let me explain my question with a simple (but artificial) example. Consider the method:

    public static int TwiceTheInput(int x)
    {
        return x*2;
    }

      

I can create an expression to call the above method by doing something like:

    {
        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()();
    }

      

When executed, the "result" above should be 20. Now let's look at a version of TwiceTheInput () that uses link parameters:

    public static void TwiceTheInputByRef(ref int x)
    {
        x = x * 2;
    }

      

How can I write a similar expression tree to call TwiceTheInputByRef () and pass arguments by reference?

Solution: (Thanks to Cicada). Using:

Type.MakeByRefType()

      

Here's a segment of code for generating an expression tree:

        {
        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()();
    }

      

+3


source to share


1 answer


You don't need to change much, just delete Assign

and change typeof(int)

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

      

+3


source







All Articles