Пример #1
0
        //对实现了迭代接口的操作类进行遍历
        public static ELoop Foreach(IIterator instance, Action <Action> action)
        {
            //获取迭代需要的属性等
            instance.Initialize();

            ELoop       loopHandler = new ELoop();
            ILGenerator CurrentIL   = loopHandler.il;

            Label lb_while_end   = CurrentIL.DefineLabel();
            Label lb_while_start = CurrentIL.DefineLabel();

            CurrentIL.MarkLabel(lb_while_start);                     //设置标签位置-循环开始
            CurrentIL.Emit(OpCodes.Ldloca, instance.TempEnumerator); //加载由结构体构成的迭代对象
            CurrentIL.Emit(OpCodes.Call, instance.MoveNext);         //调用movenext方法
            CurrentIL.Emit(OpCodes.Brfalse_S, lb_while_end);         //如果为false跳转到结束标签

            Action loadCurrentElemenet = () => {                     //loadCurrentElemenet用来加载当前元素
                instance.LoadCurrentElement(null);                   //执行实现了迭代接口的方法,通常这个方法是为了加载当前元素
            };

            if (action != null)
            {
                action(loadCurrentElemenet);                         //执行主要逻辑
            }

            CurrentIL.Emit(OpCodes.Br_S, lb_while_start);            //无条件跳转开始标签
            CurrentIL.MarkLabel(lb_while_end);                       //设置标签位置-循环结束

            CurrentIL.Emit(OpCodes.Ldloca, instance.TempEnumerator); //调用dispose方法
            CurrentIL.Emit(OpCodes.Call, instance.Dispose);
            return(loopHandler);
        }