コード例 #1
0
        public override IEnumerator Init()
        {
            App.On(ApplicationEvents.OnStartComplete, (sender, e) =>
            {
                var filters = new FilterChain <string>();

                bool isCall = true;
                filters.Add((data, next) =>
                {
                    //这里模拟一个递归调用
                    if (isCall)
                    {
                        isCall = false;
                        filters.Do("sub", (d) => UnityEngine.Debug.Log("filter end , " + d));
                    }
                    UnityEngine.Debug.Log("hello this is filter chain 1 , " + data);
                    next(data);
                    UnityEngine.Debug.Log("back filter chain 1");
                });

                filters.Add((data, next) =>
                {
                    UnityEngine.Debug.Log("hello this is filter chain 2 , " + data);
                    next(data);
                    UnityEngine.Debug.Log("back filter chain 2");
                });

                filters.Do("hello world", (data) => UnityEngine.Debug.Log("filter end , " + data));
            });

            yield return(base.Init());
        }
コード例 #2
0
        public void TestNullThen()
        {
            var chain1 = new FilterChain <string>();

            chain1.Add((str, next) => { });
            chain1.Add((str, next) => { });

            ExceptionAssert.DoesNotThrow(() =>
            {
                chain1.Do(null);
            });

            var chain2 = new FilterChain <string, string>();

            chain2.Add((str, str1, next) => { });
            chain2.Add((str, str1, next) => { });

            ExceptionAssert.DoesNotThrow(() =>
            {
                chain2.Do(null, null);
            });

            var chain3 = new FilterChain <string, string, string>();

            chain3.Add((str, str1, str2, next) => { });
            chain3.Add((str, str1, str2, next) => { });

            ExceptionAssert.DoesNotThrow(() =>
            {
                chain3.Do(null, null, null);
            });
        }
コード例 #3
0
        public void TestFilterChainT1()
        {
            var chain = new FilterChain <string>();

            var data   = "123";
            var isCall = false;

            chain.Add((inData, next) =>
            {
                if (inData == data)
                {
                    isCall = true;
                }
                next(inData);
            });
            chain.Add((in1Data, next) =>
            {
                next(in1Data);
            });
            var completeCall = false;

            chain.Do(data, (in1) =>
            {
                completeCall = true;
            });

            Assert.AreEqual(2, chain.FilterList.Length);
            Assert.AreEqual(true, isCall);
            Assert.AreEqual(true, completeCall);
        }
コード例 #4
0
        public void TestFilterChainT1T2T3()
        {
            var chain = new FilterChain <string, string, string>();

            var data1 = "123";
            var data2 = "222";
            var data3 = "333";

            var isCall = false;

            chain.Add((in1Data, in2Data, in3Data, next) =>
            {
                if (in1Data == data1 && in2Data == data2 && in3Data == data3)
                {
                    isCall = true;
                }
                next(in1Data, in2Data, in3Data);
            });

            chain.Add((in1Data, in2Data, in3Data, next) =>
            {
                next(in1Data, in2Data, in3Data);
            });

            var completeCall = false;

            chain.Do(data1, data2, data3, (in1, in2, in3) =>
            {
                completeCall = true;
            });

            Assert.AreEqual(2, chain.FilterList.Length);
            Assert.AreEqual(true, isCall);
            Assert.AreEqual(true, completeCall);
        }
コード例 #5
0
        /// <summary>
        /// 初始化
        /// </summary>
        public void Init()
        {
            App.On(ApplicationEvents.OnStartCompleted, (payload) =>
            {
                var filters = new FilterChain <string>();

                var isCall = true;
                filters.Add((data, next) =>
                {
                    if (isCall)
                    {
                        isCall = false;
                        filters.Do("sub", (d) => UnityEngine.Debug.Log("filter end , " + d));
                    }
                    UnityEngine.Debug.Log("hello this is filter chain 1 , " + data);
                    next(data);
                    UnityEngine.Debug.Log("back filter chain 1");
                });

                filters.Add((data, next) =>
                {
                    UnityEngine.Debug.Log("hello this is filter chain 2 , " + data);
                    next(data);
                    UnityEngine.Debug.Log("back filter chain 2");
                });

                filters.Do("hello world", (data) => UnityEngine.Debug.Log("filter end , " + data));
            });
        }
コード例 #6
0
        private static (FilterChain, List <string>) RecursiveParseFilterArgs(string[] args, int index = 0,
                                                                             FilterChain filters      = null, List <string> remainingArgs = null)
        {
            filters       = filters ?? new FilterChain();
            remainingArgs = remainingArgs ?? new List <string>();
            if (args.Length < index + 1)
            {
                return(filters, remainingArgs);
            }

            string arg = args[index++];

            (FilterDelegate filterDelegate, var colorRange, double[] filterParams) = CliArgs.GetDelegateAndData(arg);

            if (filterDelegate is FilterDelegate func)
            {
                filters.Add(func, colorRange, filterParams);
            }
            else
            {
                remainingArgs.Add(arg);
            }

            (filters, remainingArgs) = RecursiveParseFilterArgs(args, index, filters, remainingArgs); // recurse
            return(filters, remainingArgs);
        }
コード例 #7
0
        static void Main(string[] args)
        {
            /*
             * PurchaseRequest request = new PurchaseRequest { Amount = 20000 };
             * Handler zuzhang = new ZuZhang("张三");
             * Handler zongjian = new ZongJian("李四");
             * Handler zongjingli = new ZongJingLi("王五");
             *
             * zuzhang.Next(zongjian);
             * zongjian.Next(zongjingli);
             *
             * zuzhang.HandleRequest(request);
             */

            Request  request  = new Request();
            Response response = new Response();
            var      chain    = new FilterChain();

            chain.Add(new ActionExecutingFilter()).Add(new ActionExecutedFilter()).Add(new ExceptionFilter());
            chain.DoFilter(request, response);
            Console.WriteLine(request.Header);
            Console.WriteLine(response.Data);

            Console.ReadKey();
        }
コード例 #8
0
        public void RecursiveCallChain()
        {
            var chain = new FilterChain <string>();

            var data   = "123";
            var isCall = false;

            chain.Add((inData, next) =>
            {
                if (inData == data)
                {
                    isCall = !isCall;
                }
                if (isCall)
                {
                    chain.Do(data, (in1) =>
                    {
                    });
                }
                next(inData);
            });

            chain.Add((in1Data, next) =>
            {
                next(in1Data);
            });

            var completeCall = false;

            chain.Do(data, (in1) =>
            {
                completeCall = true;
            });
            Assert.AreEqual(false, isCall);
            Assert.AreEqual(true, completeCall);
        }