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.Call
String.Concat
都不行這樣,由於無效的參數數量。 所以,我認爲我需要這樣的東西:
- 創建
List<string>
-variable表達 - 兩個值添加到列表中
- 使用
String.Concat
與列表表達。
對不起,對嗎?
如果是的話,我該如何創建一個List變量(或一個數組),將兩個值都作爲參數加入我的String.Concat
?
哦。是。我一直無法接受這一點。太棒了,它完美的作品:) –
或者你可以使用'new [] {typeof(object),typeof(object)}'來調用帶兩個'object'參數的重載,並且不需要調用'ToString() '。使用解釋型表達式編譯器,由於解釋器的步驟更少,因此可能效率更高。通過IL編譯一個函數,它可能會稍微低效(當直接調用'int.ToString()'時不需要加框,但是可以這樣做),但簡化表達式可能還是值得的。 –
@JonHanna謝謝你的提示,但現在我得到一個異常。它不能使用Int32類型的對象作爲Object類型的參數。 –