Expression

http://d.hatena.ne.jp/Nobuhisa/20070811/1186837364 の続き(?)

public void Test()
{
	ParameterExpression paramExp = Expression.Parameter( typeof( int ), "hoge" );
	ConstantExpression constantExp = Expression.Constant( 10, typeof( int ) );
	BinaryExpression binaryExp = Expression.Multiply( paramExp, constantExp );
	Expression<Func<int, int>> exp = Expression.Lambda<Func<int, int>>( binaryExp, paramExp );
	Func<int, int> func = exp.Compile();
	Console.WriteLine( func( 100 ) );
}
public void Test2()
{
	Expression<Func<int,int>> exp = hoge => hoge * 10;
	Func<int,int> func = exp.Compile();
	Console.WriteLine( func( 100 ) );
}

これをreflectorで逆アセンブルしてみると

public void Test()
{
    ParameterExpression paramExp;
    ConstantExpression constantExp = Expression.Constant(10, typeof(int));
    Console.WriteLine(Expression.Lambda<Func<int, int>>(Expression.Multiply(paramExp = Expression.Parameter(typeof(int), "hoge"), constantExp), new ParameterExpression[] { paramExp }).Compile()(100));
}
public void Test2()
{
    ParameterExpression CS$0$0000;
    Console.WriteLine(Expression.Lambda<Func<int, int>>(Expression.Multiply(CS$0$0000 = Expression.Parameter(typeof(int), "hoge"), Expression.Constant(10, typeof(int))), new ParameterExpression[] { CS$0$0000 }).Compile()(100));
}

こんな風に展開されてました。


面白いけど、現段階だと式いじるのかなり面倒臭いなぁ・・・。
DLINQではExpressionTreeをもとにSQLを生成してるそうですね。