RunningCSharp

MS系開発者による、雑多な記事。記事は所属企業とは関係のない、個人の見解です。

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つラムダ式を用意したほうが良い気がしてしまいます。 もっと複雑な式を動的生成する場合には、全パターンのラムダ式を用意するより、動的に生成したほうがスマートになるケースもあるかもしれません。