大体5ヶ月くらい前に、ExpressionTreeを組み立てようとして挫折してるエントリがある。
そろそろ、頭もすっきり忘れてる頃なので、もう一度叩き込んでみてもいいだろうと思って書いてみる。
ちなみ、大体Blogのエントリはやりながら書いてるので、出来なかったり出来たりするのかは、冒頭の部分を書いてる時点では不明なのです。
(大体筋道は考えてるけどね!)
ということで、ExpressionTreeBuildSampleという名前でコンソールアプリケーションを作った。
まずは、簡単な復習から。
using System;
using System.Linq.Expressions;
namespace ExpressionTreeBuildSample
{
class Program
{
static void Main(string[] args)
{
// ラムダ式からExpressionオブジェクトを作って
Expression<Func<int, bool>> ex = i => i % 2 == 0;
// CompileでFuncにして
Func<int, bool> f = ex.Compile();
// 呼んでみる
Console.WriteLine(f(10)); // True
Console.WriteLine(f(1)); // False
}
}
}
ふむふむ。なんとなく思い出してきた。
FuncからExpressionにはどうやるんだろ?と思って探してみたが、見つけれなかった。ということで、ラムダ式を使わないで同じ事をしようとすると、下のようなものになってしまう。
using System;
using System.Linq.Expressions;
namespace ExpressionTreeBuildSample
{
class Program
{
static void Main(string[] args)
{
// パラメータ
var param = Expression.Parameter(typeof(int), "i");
// パラメータ % 2
var div = Expression.Modulo(param, Expression.Constant(2));
// パラメータ % 2 == 0
var eq = Expression.Equal(div, Expression.Constant(0));
// ラムダ式にして
var ex = Expression.Lambda<Func<int, bool>>(eq, param);
// デリゲートにコンパイル
var f = ex.Compile();
// 使ってみる
Console.WriteLine(f(10)); // True
Console.WriteLine(f(1)); // False
}
}
}
結構ヘビーなので心が折れそうになる。