8

参照パラメーターを持つメソッドを呼び出す式を作成する方法を理解しようとしています。

簡単な(しかし人工的な)例で私の質問を説明しましょう。次の方法を検討してください。

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

1 に答える 1

8

あまり変更する必要はありません。を削除して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
);
于 2013-02-18T16:00:04.063 に答える