Вам нужно позвонить в string.Concat
(компилятор C # превращает конкатенацию строк в вызовы string.Concat
под колпаком).
var concatMethod = typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) });
var first = Expression.Constant("a");
var second = Expression.Constant("b");
var concat = Expression.Call(concatMethod, first, second);
var lambda = Expression.Lambda<Func<string>>(concat).Compile();
Console.WriteLine(lambda()); // "ab"
На самом деле, если вы пишете
Expression<Func<string, string string>> x = (a, b) => a + b;
и осмотрите его в отладчике, вы увидите, что он генерирует BinaryExpression
(с Method
из string.Concat(string, string)
), а не MethodCallExpression
.Поэтому компилятор фактически использует ответ @ kalimag, а не мой.Оба будут работать, однако.