次のコードを書くことで、これを行う方法を見つけることができます。
Expression<Func<int, int, int>> multiply =
(left, right) => left * right;
アセンブリにコンパイルし、IL逆アセンブラ(Reflectorなど)を使用して、C#コンパイラが生成したコードを確認します。
与えられた例では、C#コンパイラは次のようなものを生成します。
var left = Expression.Parameter(typeof(int), "left");
var right = Expression.Parameter(typeof(int), "right");
var multiply = Expression.Lambda<Func<int, int, int>>(
Expression.Multiply(left, right),
new ParameterExpression[] { left, right });
そして、これはまさに乗算式を指定するために必要なことです。
ジェネリックメソッドに配置すると、次のようになります。
public static Func<T, T, T> BuildMultiplier<T>()
{
var left = Expression.Parameter(typeof(T), "left");
var right = Expression.Parameter(typeof(T), "right");
var multiply = Expression.Lambda<Func<T, T, T>>(
Expression.Multiply(left, right),
new ParameterExpression[] { left, right });
return multiply.Compile();
}