为字符串连接两个对象创建表达式树

时间:2017-01-19 13:07:14

标签: c# .net lambda expression-trees

我只是在了解Expression及其表达式树,以便将它们与IronPython一起使用(但现在这无关紧要)。

我要做的是,创建一个表达式树,如下面的lambda:

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的{​​{1}}以这种方式工作。 所以我想我需要这样的东西:

  • 创建List<string> - 变量表达式
  • 将两个值添加到列表中
  • String.Concat与list-expression一起使用。

我是对的吗?

如果是,我如何创建List-variable(或Array),添加两个值以将其作为String.Concat的参数?

1 个答案:

答案 0 :(得分:6)

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) });