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を生成してるそうですね。