在Lambda表达式中进行递归调用

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

如果你看过我这文章让您知道您的方法是被何“人”调用 》的话,你应该会“啊哈”的拍一下头脑,思路就出来了,没错!!就是直接用StackFrame获取当前执行的方法,然后直接Invoke即可。

示例代码:

None.gif      class  Test
ExpandedBlockStart.gif    
{
ExpandedSubBlockStart.gif        
/// <summary>
InBlock.gif        
/// 
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="v1"></param>
InBlock.gif        
/// <param name="v2"></param>
InBlock.gif        
/// <param name="num"></param>
InBlock.gif        
/// <param name="total"></param>
ExpandedSubBlockEnd.gif        
/// <returns></returns>

InBlock.gif        public delegate long AddMethod(long v1, long v2, int num, int cout);
InBlock.gif
ExpandedSubBlockStart.gif        
/// <summary>
InBlock.gif        
/// 
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="addMethod"></param>
ExpandedSubBlockEnd.gif        
/// <param name="cout"></param>

InBlock.gif        static void Print(AddMethod method, int cout)
ExpandedSubBlockStart.gif        
{
InBlock.gif            Console.WriteLine(method(
01, 2, cout));
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
static void Main()
ExpandedSubBlockStart.gif        
{
InBlock.gif            
//求0,1,1,2,3,5,8dot.gif.类似的数据队列在第30个位置的数
InBlock.gif
            Print((v1, v2, num, cout) =>
ExpandedSubBlockStart.gif                
{
InBlock.gif                    Console.Write(v1);
InBlock.gif                    Console.Write(
",");
InBlock.gif
InBlock.gif                    num
++;
InBlock.gif                    
if (num == cout)
ExpandedSubBlockStart.gif                    
{
InBlock.gif                        Console.Write(v2);   
InBlock.gif                        Console.WriteLine();
InBlock.gif                        
return v1 + v2;
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    
else
ExpandedSubBlockStart.gif                    
{                        
InBlock.gif                        
//取得当前方法
InBlock.gif
                        StackFrame frame = new StackFrame(0);
InBlock.gif                        
//递归调用
ExpandedSubBlockStart.gif
                        return (long)(frame.GetMethod().Invoke(num, new object[] { v2, (v1 + v2), num, cout }));
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }
30);
InBlock.gif            Console.Read();
ExpandedSubBlockEnd.gif        }

ExpandedBlockEnd.gif    }

我们的代码成功运行了 shades_smile.gif,成功的求出在第30个位置的数值是:514229

其时,.NET里还有一个东东可以方便的得到当前调用方法的引用,这东东就是 MethodBase,其有一个静态方法GetCurrentMethod 可直接获取当前执行的方法引用,所以我们可以将上面的StackFrame处的两句代码改为如下:
None.gif                          // 递归调用
ExpandedBlockStart.gif
                         return  ( long )(MethodBase.GetCurrentMethod().Invoke(num,  new   object []  { v2, (v1 + v2), num, cout } ));

执行后的结果都是一样的 teeth_smile.gif(不一样才怪了Orz)
本文转自Kingthy博客园博客,原文链接:http://www.cnblogs.com/kingthy/archive/2008/04/20/1162248.html ,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值