次のように、特定の型の LINQ 式を作成してコンパイルすることで、これを行うことができます。
private static IDictionary<Type,object> MultByType = new Dictionary<Type,object>();
public static T Multiply<T>(T a, int b) {
Func<T,int,T> mult;
object tmp;
if (!MultByType.TryGetValue(typeof (T), out tmp)) {
var lhs = Expression.Parameter(typeof(T));
var rhs = Expression.Parameter(typeof(int));
mult = (Func<T,int,T>) Expression.Lambda(
Expression.Multiply(lhs, Expression.Convert(rhs, typeof(T)))
, lhs
, rhs
).Compile();
MultByType.Add(typeof(T), mult);
} else {
mult = (Func<T,int,T>)tmp;
}
return mult(a, b);
}
式が使用されるたびに再コンパイルするのを避けるために、式を辞書にキャッシュすることができます。
このアプローチには一定の制限があることに注意してください。
T
byの乗算T
が定義されていることが期待されます。
T
乗算の出力は、変換なしであると予想されます。int
これは、より小さい型には当てはまりません。
- タイプは からの変換をサポートする必要があり
int
ます。
これはコンパイル時にチェックされません。