2017-01-19 20 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類型的參數。 –

相關問題