Expression.Call 带有 IEnumerable<string> 参数
Expression.Call with IEnumerable<string> parameter
我想用表达式树实现这个简单的代码。
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]);
此处的 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);
我想用表达式树实现这个简单的代码。
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]);
此处的 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);