Как смоделировать строку + строка через выражение? - PullRequest
1 голос
/ 15 марта 2019

Как я могу имитировать строку + выражение строки через выражение c #.Метод Expression.Add не работает.

строка + строковое выражение типа

"111" + "222" = "111222"

спасибо

Ответы [ 2 ]

3 голосов
/ 15 марта 2019

Вам нужно позвонить в 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;

и осмотрите его в отладчике, вы увидите, что он генерирует BinaryExpressionMethod из string.Concat(string, string)), а не MethodCallExpression.Поэтому компилятор фактически использует ответ @ kalimag, а не мой.Оба будут работать, однако.

2 голосов
/ 15 марта 2019

Expression.Add имеет перегрузку, которая принимает MethodInfo, который может быть любым static методом, совместимым с данными типами параметров:

var concatMethod = typeof(string).GetMethod(nameof(String.Concat), new [] { typeof(string), typeof(string)});
var expr = Expression.Add(Expression.Constant("a"), Expression.Constant("b"), concatMethod);

На практике это похоже на Expression.Call, но создает другое дерево выражений и по-разному отображается в отладчике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...