我只是在學習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);
}
由於參數計數無效, String.Concat
的Expression.Call
將不會以這種方式工作。所以我想我需要這樣的東西:
List<string>
-variable-expression String.Concat
與list-expression一起使用。 我對嗎?
如果是,我如何創建List-variable(或Array),添加兩個值以將其作為String.Concat
參數?
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) });