2017-01-19 21 views
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.CallString.Concat都不行这样,由于无效的参数数量。 所以,我认为我需要这样的东西:

  • 创建List<string> -variable表达
  • 两个值添加到列表中
  • 使用String.Concat与列表表达。

对不起,对吗?

如果是的话,我该如何创建一个List变量(或一个数组),将两个值都作为参数加入我的String.Concat

回答

4

String.Concat方法有11(!)重载,并且您正在随机选择一个。

最适合你的情况是

public static String Concat(String str0, String str1) 

,您可以通过以下Type.GetMethod超载

public MethodInfo GetMethod(string name, Type[] types) 

其中types数组代表的方法参数的类型得到:

var stringConcat = typeof(string).GetMethod("Concat", 
    new[] { typeof(string), typeof(string) }); 
+1

哦。是。我一直无法接受这一点。太棒了,它完美的作品:) –

+1

或者你可以使用'new [] {typeof(object),typeof(object)}'来调用带两个'object'参数的重载,并且不需要调用'ToString() '。使用解释型表达式编译器,由于解释器的步骤更少,因此可能效率更高。通过IL编译一个函数,它可能会稍微低效(当直接调用'int.ToString()'时不需要加框,但是可以这样做),但简化表达式可能还是值得的。 –

+0

@JonHanna谢谢你的提示,但现在我得到一个异常。它不能使用Int32类型的对象作为Object类型的参数。 –

相关问题