拼吾爱程序人生

首页 » .Net编程 » Visual Studio.NET » 在Lambda表达式中进行递归调用
cobra - 2008-4-20 13:58:00
文/kingthy  出处/博客园

Lambda表达式是一个匿名的方法,在开发期我们是不知道其方法名是什么的,所以我们要怎么递归调用呢?

如果你看过我这文章《让您知道您的方法是被何“人”调用》的话,你应该会“啊哈”的拍一下头脑,思路就出来了,没错!!就是直接用StackFrame获取当前执行的方法,然后直接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.类似的数据队列在第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 }));

执行后的结果都是一样的

 您可能对 [Visual Studio.NET] 的这些文章也感兴趣:

Attribute在.net编程中的应用(一)
Attribute在.net编程中的应用(二)
Java、.NET,为什么不合二为一?
.NET 框架中的 Factory 模式
.NET和JAVA的跨平台,程序员很期望
.NET还是JAVA,一个中国程序员的评论
NBearMapping - 开源通用对象映射组件v1.0.0.0 beta
ObjectBuilder中WeakRefDictionary使用模式浅析
面向对象的应用服务层设计
Sending email with an embedded image through ASP.NET
邮件发送类,支持HTML格式,支持优先级设置
使用.NET发送邮件
1
查看完整版本: 在Lambda表达式中进行递归调用
Modify by pin5i DZNT_ExpandPackage 2.1.3295 2007-2009 pin5i.com
 Total Unique Visitors: