早く C# 4.0 出ないかなぁ。
[C#] 複素数型を作る。
Expression trees と .NET 風メタプログラミング - NyaRuRuが地球にいたころ
ちょっと考えた結果、以下のようなクラス1個作っておいたらものすごい便利な気がした。
using System; using System.Linq.Expressions; using Binary = Func<ParameterExpression, ParameterExpression, BinaryExpression>; using Unary = Func<ParameterExpression, UnaryExpression>; /// <summary> /// 動的に型 T の加減乗除関数を作る。 /// </summary> /// <typeparam name="T">対象となる型。</typeparam> public static class Operator<T> { static readonly ParameterExpression x = Expression.Parameter(typeof(T), "x"); static readonly ParameterExpression y = Expression.Parameter(typeof(T), "y"); public static readonly Func<T, T, T> Add = Lambda(Expression.Add); public static readonly Func<T, T, T> Subtract = Lambda(Expression.Subtract); public static readonly Func<T, T, T> Multiply = Lambda(Expression.Multiply); public static readonly Func<T, T, T> Divide = Lambda(Expression.Divide); public static readonly Func<T, T, T> Modulo = Lambda(Expression.Modulo); public static readonly Func<T, T> Plus = Lambda(Expression.UnaryPlus); public static readonly Func<T, T> Negate = Lambda(Expression.Negate); public static Func<T, T, T> Lambda(Binary op) { return Expression.Lambda<Func<T, T, T>>(op(x, y), new[] { x, y }).Compile(); } public static Func<T, T> Lambda(Unary op) { return Expression.Lambda<Func<T, T>>(op(x), new[] { x }).Compile(); } } class Program { static void Main(string[] args) { int x = 5; int y = 6; Console.Write("{0}, {1}, {2}, {3}, {4}\n", Operator<int>.Add(x, y), Operator<int>.Subtract(x, y), Operator<int>.Multiply(x, y), Operator<int>.Divide(x, y), Operator<int>.Modulo(x, y)); } }
ちょうどこないだ、++C++; にジェネリクス関係の話ちょっと追加したところにこういう話題が出てたので食いついてみた。
あと、最近、機会があって C# でリフレクション使いまくりなんですけども、毎度毎度 RTTI 見に行くのは重たいし、動的コード生成してキャッシュしたいなぁとか常々思ってたり。C# 4.0 が出ればいろいろ夢は広がるんですけども。
今の System.Linq.Expressions だと、文字通りの式、単文しか作れないからやれることが自然と限られるんで。