2

myNumberに5を掛けるデリゲートを生成するこのコードがあります

ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
ConstantExpression five = Expression.Constant(5, typeof(int));
BinaryExpression numMultiply = Expression.Multiply(numParam,five);

デリゲートを作成しましょう:

Expression<Func<int, int>> lambda1 =
    Expression.Lambda<Func<int, int>>(
        numMultiply,
        new ParameterExpression[] { numParam });
Console.Write(lambda1.Compile()(4));

Addここで、この式ツリーをここではなくに変更したいとしますMultiply
。新しい行です。

BinaryExpression numAdd = Expression.Add(numParam,five);

しかし、ラムダ1を変更して、numAdd代わりに使用するようにするにはどうすればよいmultiplyですか?

4

1 に答える 1

6

新しいものを作成し、コンパイルするだけです。

Expression<Func<int, int>> lambda1 =
     Expression.Lambda<Func<int, int>>(
         numAdd,
         new ParameterExpression[] { numParam });

MSDNページから:

式ツリーは不変である必要があります。つまり、式ツリーを変更する場合は、既存の式ツリーをコピーしてその中のノードを置き換えることにより、新しい式ツリーを作成する必要があります。式ツリービジターを使用して、既存の式ツリーをトラバースできます。

「shouldbe」というフレーズは少し奇妙ですが、APIを見ると、関連するすべてのプロパティ(Body、Left、Right)が読み取り専用であることがわかります。

于 2013-01-14T19:06:40.243 に答える