看到篇很好的文章,介绍给大家看看 Lambda表达式是一个匿名的方法,在开发期我们是不知道其方法名是什么的,所以我们要怎么递归调用呢?如果你看过我这文章《让您知道您的方法是被何“人”调用 》的话,你应该会“啊哈”的拍一下头脑,思路就出来了,没错!!就是直接用StackFrame获取当前执行的方法,然后直接Invoke即可。 示例代码: class Test { /**//// /// /// /// /// /// /// /// public delegate long AddMethod(long v1, long v2, int num, int cout);
/**//// /// /// /// /// static void Print(AddMethod method, int cout) { Console.WriteLine(method(0, 1, 2, cout)); } static void Main() { //求0,1,1,2,3,5,8.类似的数据队列在第30个位置的数 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个位置的数值是:514229其时,.NET里还有一个东东可以方便的得到当前调用方法的引用,这东东就是MethodBase,其有一个静态方法GetCurrentMethod 可直接获取当前执行的方法引用,所以我们可以将上面的StackFrame处的两句代码改为如下: //递归调用 return (long)(MethodBase.GetCurrentMethod().Invoke(num, new object[] { v2, (v1 + v2), num, cout })); 执行后的结果都是一样的(不一样才怪了Orz)
|