私は最近、次のことが機能することが実証された例を見ました。
T Add<T>(dynamic a, dynamic b)
{
return a + b;
}
Add<string>("hello", "world"); // Returns "helloworld"
ただし、式を使用して「一般的な」Add関数を作成しようとすると、次のようになります。
ParameterExpression left = Expression.Parameter(typeof(T), "left");
ParameterExpression right = Expression.Parameter(typeof(T), "right");
var add = Expression.Lambda<Func<T, T, T>>(Expression.Add(left, right), left, right).Compile(); // Fails with System.InvalidOperationException : The binary operator Add is not defined for the types 'System.String' and 'System.String' when T == String.
次に、この関数を文字列で使用しましたが、String型は実際には+演算子を実装しておらず、String.Concat()の単なる構文糖衣であるため失敗します。
では、動的にこれを機能させるにはどうすればよいでしょうか。実行時に、String.Concat()を使用して+が書き換えられるポイントを過ぎていることがわかりました。