using System; using System.Linq.Expressions; namespace GenericOperator { using Binary = Func; using Unary = Func; /// /// 動的にジェネリック型 T の加減乗除関数を作る。 /// /// 対象となる型。 public static class Operator { static readonly ParameterExpression x = Expression.Parameter(typeof(T), "x"); static readonly ParameterExpression y = Expression.Parameter(typeof(T), "y"); static readonly ParameterExpression z = Expression.Parameter(typeof(T), "z"); static readonly ParameterExpression w = Expression.Parameter(typeof(T), "w"); public static readonly Func Add = Lambda(Expression.Add); public static readonly Func Subtract = Lambda(Expression.Subtract); public static readonly Func Multiply = Lambda(Expression.Multiply); public static readonly Func Divide = Lambda(Expression.Divide); public static readonly Func Plus = Lambda(Expression.UnaryPlus); public static readonly Func Negate = Lambda(Expression.Negate); public static Func Lambda(Binary op) { return Expression.Lambda>(op(x, y), x, y).Compile(); } public static Func Lambda(Unary op) { return Expression.Lambda>(op(x), x).Compile(); } public static readonly Func ProductSum = Expression.Lambda>( Expression.Add( Expression.Multiply(x, y), Expression.Multiply(z, w)), x, y, z, w).Compile(); public static readonly Func ProductDifference = Expression.Lambda>( Expression.Subtract( Expression.Multiply(x, y), Expression.Multiply(z, w)), x, y, z, w).Compile(); } }