Expression.Call与IEnumerable <string>参数

时间:2015-07-14 11:09:25

标签: c# .net ienumerable expression-trees

我想使用表达式树实现这个简单的代码。

var strs = new List<string>(){"m", "k", "l"};
var result = string.Concat(strs); // result = "mkl"

我的代码如下:

var exps = new List<Expression>
{ 
   Expression.Constant("m"), 
   Expression.Constant("k"), 
   Expression.Constant("l") 
};
var concat = typeof(string).GetMethod("Concat", new[] { typeof(IEnumerable<string>) });
Expression.Call(concat, exps);

但是有例外Wrong number of type arguments passed to method

出了什么问题以及如何做到这一点?

当我使用时:

var concat = typeof (string).GetMethod("Concat", new[] {typeof (string), typeof (string)});
Expression.Call(concat, exps[0], exps[1]);

1 个答案:

答案 0 :(得分:2)

此处Concat采用IEnumerable<string>而不是three字符串参数的参数,因此您应该为参数使用类型为IEnumerable<string>的表达式,例如

var argExpression = Expression.Constant(new List<string>() { "m", "k", "l" });

var concat = typeof(string).GetMethod("Concat", new[] { typeof(IEnumerable<string>) });
Expression.Call(concat, argExpression);

要从表达式构造IEnumerable<string>以作为单个参数传递,那么您可以构造一个数组:

var exps = new List<Expression>
{ 
    Expression.Constant("m"), 
    Expression.Constant("k"), 
    Expression.Constant("l") 
};

var concat = typeof(string).GetMethod("Concat", new[] { typeof(IEnumerable<string>) });
var argExpr = Expression.NewArrayInit(typeof(string), exps);
Expression.Call(concat, argExpr);