看到篇很好的文章,介紹給大家看看 Lambda表達式是一個匿名的方法,在開發(fā)期我們是不知道其方法名是什么的,所以我們要怎么遞歸調用呢?如果你看過我這文章《讓您知道您的方法是被何“人”調用 》的話,你應該會“啊哈”的拍一下頭腦,思路就出來了,沒錯!!就是直接用StackFrame獲取當前執(zhí)行的方法,然后直接Invoke即可。 示例代碼: class Test { /**//// <summary> /// /// </summary> /// <param name="v1"></param> /// <param name="v2"></param> /// <param name="num"></param> /// <param name="total"></param> /// <returns></returns> public delegate long AddMethod(long v1, long v2, int num, int cout);
/**//// <summary> /// /// </summary> /// <param name="addMethod"></param> /// <param name="cout"></param> static void Print(AddMethod method, int cout) { Console.WriteLine(method(0, 1, 2, cout)); } static void Main() { //求0,1,1,2,3,5,8.類似的數(shù)據(jù)隊列在第30個位置的數(shù) Print((v1, v2, num, cout) => { Console.Write(v1); Console.Write(",");
num++; if (num == cout) { Console.Write(v2); Console.WriteLine(); return v1 + v2; } else { //取得當前方法 StackFrame frame = new StackFrame(0); //遞歸調用 return (long)(frame.GetMethod().Invoke(num, new object[] { v2, (v1 + v2), num, cout })); } }, 30); Console.Read(); } } 我們的代碼成功運行了,成功的求出在第30個位置的數(shù)值是:514229其時,.NET里還有一個東東可以方便的得到當前調用方法的引用,這東東就是MethodBase,其有一個靜態(tài)方法GetCurrentMethod 可直接獲取當前執(zhí)行的方法引用,所以我們可以將上面的StackFrame處的兩句代碼改為如下: //遞歸調用 return (long)(MethodBase.GetCurrentMethod().Invoke(num, new object[] { v2, (v1 + v2), num, cout })); 執(zhí)行后的結果都是一樣的(不一樣才怪了Orz)
|