C#:式木で四則演算を行うデリゲートを生成
とりあえず式木を使ってみたい、位の気持ちで記事にしてしまいました。
引数と定数「2」とで四則演算を行うメソッドを生成するメソッドです。
enum CalcType { Add, Subtract, Multiply, Divide } static Func<int, int> CreateExpression2(CalcType type) { var param = Expression.Parameter(type: typeof(int)); var consttwo = Expression.Constant(2); BinaryExpression calc = null; switch (type) { case CalcType.Add: calc = Expression.Add(param, consttwo); break; case CalcType.Subtract: calc = Expression.Subtract(param, consttwo); break; case CalcType.Multiply: calc = Expression.Multiply(param, consttwo); break; case CalcType.Divide: calc = Expression.Divide(param, consttwo); break; } if (calc == null) return null; var lambda = Expression.Lambda(calc, param); return (Func<int, int>)lambda.Compile(); }
以下のように使用します。
static void Main() { var Add = CreateExpression2(CalcType.Add); var Subtract = CreateExpression2(CalcType.Subtract); var Multiply = CreateExpression2(CalcType.Multiply); var Divide = CreateExpression2(CalcType.Divide); Console.WriteLine("Add : " + Add(8).ToString());//引数と「2」の足し算結果 Console.WriteLine("Subtract : " + Subtract(8).ToString());//引数と「2」の引き算結果 Console.WriteLine("Multiply : " + Multiply(8).ToString());//引数と「2」の掛け算結果 Console.WriteLine("Divide : " + Divide(8).ToString());//引数と「2」の割り算結果 Console.ReadLine(); }
結果
Add : 10
Subtract : 6
Multiply : 16
Divide : 4
このくらいなら正直、普通に4つラムダ式を用意したほうが良い気がしてしまいます。 もっと複雑な式を動的生成する場合には、全パターンのラムダ式を用意するより、動的に生成したほうがスマートになるケースもあるかもしれません。