如何通过表达式模拟字符串+字符串?

时间:2019-03-15 12:35:59

标签: c# expression

如何通过c#表达式模拟字符串+字符串表达式。 Expression.Add方法不起作用。

字符串+字符串表达式

“ 111” +“ 222” =“ 111222”

谢谢

2 个答案:

答案 0 :(得分:3)

您需要调用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(其中Methodstring.Concat(string, string),而不是MethodCallExpression。因此,编译器实际上使用@kalimag的答案,而不是我的。两者都可以。

答案 1 :(得分:2)

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类似,但是它产生了不同的表达式树,并且在调试器中的显示方式也不同。