LINQ表達式樹我想使用表達式目錄樹動態創建調用拉姆達的方法調用拉姆達。下面的代碼對ComposeLambda函數的第一次調用運行正常,但第二次調用失敗,並顯示以下錯誤消息。如何使用C#/。NET
數目不正確的用於調用方法提供的參數 '的Int32 lambda_method(System.Runtime.CompilerServices.Closure,Int32)將'
{
Func<int, int> innerLambda = i => i + 1;
var composedLambda = ComposeLambda(innerLambda);
Console.WriteLine(composedLambda.DynamicInvoke(0));
var composedLambda2 = ComposeLambda(composedLambda);
Console.WriteLine(composedLambda2.DynamicInvoke(0));
}
private static Delegate ComposeLambda(Delegate innerLambda)
{
Func<int, int> outerLambda = i => i + 2;
var parameter = Expression.Parameter(typeof (int));
var callInner = Expression.Call(innerLambda.GetMethodInfo(), parameter);
var callOuter = Expression.Call(outerLambda.GetMethodInfo(), callInner);
var composedLambdaType = typeof (Func<,>).MakeGenericType(typeof (int), typeof (int));
var composedLambdaExpression = Expression.Lambda(composedLambdaType, callOuter, parameter);
var composedLambda = composedLambdaExpression.Compile();
return composedLambda;
}
我怎樣才能獲得,並通過此封閉對象?
@ jp2code這是在4.5:[GetMethodInfo](https://msdn.microsoft.com/en-我們/庫/ system.reflection.runtimereflectionextensions.getmethodinfo(v = vs.110)的.aspx) –
不要使用'Expression.Call(innerLambda.GetMethodInfo(),...)',這只是自找麻煩。調用的委託,而不是 - 你有沒有業務委託的「方法」亂搞 - 你不僅失去了目標(以實例方法很重要),但你也侵犯隱私(匿名方法是內部的或私有的,例如)。在這種情況下,你沒有通過閉合參數的方法:) – Luaan
@Luaan表達式樹是浪費時間的低層次的東西 - 那就是他們是什麼那裏 –