2
我刚刚学习Expression
及其表达式树以将它们与IronPython一起使用(但这与现在无关)。创建一个用于字符串协调两个对象的表达式树
我想要做的是,创造一个表达式树像下面拉姆达:
Func<T, int, string> func = (s,t) => s + t;
我现在的功能是这样的:
public static Expression<Func<T, int, string>> StringConcatSelector<T>()
{
var parameterParam = Expression.Parameter(typeof(T), "x");
var paramToString = typeof(T).GetMethods().FirstOrDefault(s=>s.Name=="ToString");
var parameter = Expression.Call(parameterParam, paramToString);
var intParameterParam = Expression.Parameter(typeof(int), "s");
var intParameterToString = typeof(int).GetMethods().FirstOrDefault(s => s.Name == "ToString");
var intParameter = Expression.Call(intParameterParam, intParameterToString);
var stringConcat = typeof(string).GetMethods().FirstOrDefault(s => s.Name == "Concat");
var result = Expression.Call(stringConcat, parameter, intParameter);
return Expression.Lambda<Func<T, int, string>>
(result, parameterParam, intParameterParam);
}
的Expression.Call
String.Concat
都不行这样,由于无效的参数数量。 所以,我认为我需要这样的东西:
- 创建
List<string>
-variable表达 - 两个值添加到列表中
- 使用
String.Concat
与列表表达。
对不起,对吗?
如果是的话,我该如何创建一个List变量(或一个数组),将两个值都作为参数加入我的String.Concat
?
哦。是。我一直无法接受这一点。太棒了,它完美的作品:) –
或者你可以使用'new [] {typeof(object),typeof(object)}'来调用带两个'object'参数的重载,并且不需要调用'ToString() '。使用解释型表达式编译器,由于解释器的步骤更少,因此可能效率更高。通过IL编译一个函数,它可能会稍微低效(当直接调用'int.ToString()'时不需要加框,但是可以这样做),但简化表达式可能还是值得的。 –
@JonHanna谢谢你的提示,但现在我得到一个异常。它不能使用Int32类型的对象作为Object类型的参数。 –