我只是在了解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
的参数?
答案 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) });