专栏首页魂祭心原 数据字典+匿名委托模拟switch/c

原 数据字典+匿名委托模拟switch/c

基本思想每个case的选择值作为键,处理过程做成函数委托存放进数据字典。用的时候根据之调用。下面上代码

封装的FuncSwitcher类

using System;
using System.Collections.Generic;

namespace Test
{
    class FuncSwitcher<T>
    {
        int count;
        Dictionary<T, Delegate> FuncGather;
        Delegate defalutFunc;
        public FuncSwitcher()
        {
            count = 0;
            FuncGather = new Dictionary<T, Delegate>();
        }
        /// <summary>
        /// 调用函数处理
        /// </summary>
        /// <param name="t"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public object Invoke(T t, object[] parameters)
        {
            if (FuncGather.ContainsKey(t))
            {
                var method = FuncGather[t];
                return method.Method.Invoke(method, parameters);
            }
            else
            {
                var method = defalutFunc;
                return method.Method.Invoke(method, null);
            }
        }
        /// <summary>
        /// 添加默认处理函数
        /// </summary>
        /// <param name="defaultFunc"></param>
        public void AddDefault(Delegate defaultFunc)
        {
            this.defalutFunc = defaultFunc;
        }
        /// <summary>
        /// 添加键值对
        /// </summary>
        /// <param name="key"></param>
        /// <param name="func"></param>
        public void AddFunc(T key, Delegate func)
        {
            FuncGather.Add(key, func);
        }
        /// <summary>
        /// 添加多对键值
        /// </summary>
        /// <param name="funcs"></param>
        public void AddRange(KeyValuePair<T, Delegate>[] funcs)
        {
            foreach (KeyValuePair<T, Delegate> func in funcs)
            {
                FuncGather.Add(func.Key, func.Value);
            }
        }
        /// <summary>
        /// 移除键值对
        /// </summary>
        /// <param name="t"></param>
        public void Remove(T t)
        {
            FuncGather.Remove(t);
        }
        /// <summary>
        /// 获取函数
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public Delegate GetFunc(T t)
        {
            return FuncGather[t];
        }
        /// <summary>
        /// 是否包含键
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public bool ContainKey(T t)
        {
            if (FuncGather.ContainsKey(t))
                return true;
            else
                return false;
        }
        /// <summary>
        /// 是否包含值
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public bool ContainValue(Delegate t)
        {
            if (FuncGather.ContainsValue(t))
                return true;
            else
                return false;
        }
        /// <summary>
        /// 清空键值
        /// </summary>
        public void Clear()
        {
            FuncGather.Clear();
            count = 0;
        }
        public int Count
        {
            get { return count; }
        }
    }
}

测试用的函数,我最偏好的加减乘除,用什么其实都无所谓。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Configuration;
using System.Diagnostics;
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            FuncSwitcher<ConsoleKey> Switcher = new FuncSwitcher<ConsoleKey>();
            ConsoleKeyInfo flag;
            Switcher.AddFunc(ConsoleKey.D0, new Action(() => { SwitchTest(); }));
            Switcher.AddFunc(ConsoleKey.D1, new Action(() => { CustomSwitchTest(); }));
            Switcher.AddFunc(ConsoleKey.D2, new Action(() => { Console.WriteLine("程序已经退出"); Environment.Exit(0); }));
            Switcher.AddDefault(new Action(() => { Console.WriteLine("重新输入"); }));

            while (true)
            {
                Console.WriteLine("********************************");
                Console.WriteLine("*****  0:switch测试      ******");
                Console.WriteLine("*****  1: CustomSwitchTest******");
                Console.WriteLine("*****  2: 退出程序        ******");
                Console.WriteLine("********************************");

                flag = Console.ReadKey();
                Console.WriteLine();
                Switcher.Invoke(flag.Key, null);
            }
        }
        /// <summary>
        /// switch/case
        /// </summary>
        public static void SwitchTest()
        {
            Console.WriteLine("********************");
            Console.WriteLine("***** add:加   ****");
            Console.WriteLine("***** sub: 减   ****");
            Console.WriteLine("***** mul: 乘   ****");
            Console.WriteLine("***** div: 除   ****");
            Console.WriteLine("*****   0:返回 ****");
            Console.WriteLine("********************");
            Console.WriteLine("输入操作");
            string operate = Console.ReadLine();
            switch (operate)
            {
                case "add":
                    Console.WriteLine(Add(1, 1));
                    break;
                case "sub":
                    Console.WriteLine(Sub(1, 1));
                    break;
                case "mul":
                    Console.WriteLine(Mul(1, 1));
                    break;
                case "div":
                    Console.WriteLine(Div(1, 1));
                    break;
                default:
                    Console.WriteLine("重新输入");
                    break;
            }
        }
        /// <summary>
        /// 自定义的选择
        /// </summary>
        public static void CustomSwitchTest()
        {
            FuncSwitcher<string> switcher = new FuncSwitcher<string>();
            switcher.AddDefault(new Action(() => { Console.WriteLine("重新输入"); }));
            switcher.AddRange(new KeyValuePair<string, Delegate>[]
            {
               new KeyValuePair<string,Delegate>("add", new Func<int,int,int>(Add)),
               new KeyValuePair<string,Delegate>("sub", new Func<int,int,int>(Sub)),
               new KeyValuePair<string,Delegate>("mul", new Func<int,int,int>(Mul)),
               new KeyValuePair<string, Delegate>("div", new Func<int, int, int>(Div)),
           });

            Console.WriteLine("********************");
            Console.WriteLine("***** add:加   ****");
            Console.WriteLine("***** sub: 减   ****");
            Console.WriteLine("***** mul: 乘   ****");
            Console.WriteLine("***** div: 除   ****");
            Console.WriteLine("*****   0:返回 ****");
            Console.WriteLine("********************");
            Console.WriteLine("输入操作");
            string operate = Console.ReadLine();
            Console.WriteLine(switcher.Invoke(operate, new object[] { 1, 1 }));
        }
        /// <summary>
        /// 测试所用,无所谓了,什么函数都可以的
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public static int Add(int x, int y)
        {
            return x + y;
        }
        public static int Sub(int x, int y)
        {
            return x - y;
        }
        public static int Mul(int x, int y)
        {
            return x * y;
        }
        public static int Div(int x, int y)
        {
            if (y != 0)
                return x / y;
            else throw new DivideByZeroException("除数不可以为0");
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 原 WCF学习之旅----基础篇之NET

    魂祭心
  • 原 WCF学习之旅----基础篇之Ente

    魂祭心
  • 原 WCF学习之旅----基础篇之MSMQ

    魂祭心
  • C#构造函数里的base和this的区别

    父类的构造函数总是在子类之前执行的。既先初始化静态构造函数,后初始化子类构造函数。

    跟着阿笨一起玩NET
  • Android--利用Box2d重力引擎打造小球碰撞效果

    Box2d是一个强大的开源物理游戏引擎,使用c/c++编写,用来模拟2D的物体运动和碰撞。Box2D内部集成了大量的物理力学和运动学计算,内部实现很复杂,但是封...

    aruba
  • C#基础知识回顾-- 反射(4)

    从程序集获得类型   先说点题外话,现在技术真的发展太快了。我这边还很多东西半生不熟 呢,那边又出现了好多有趣的新东西让你眼红不已。学还是不学这还真是 个问题。...

    hbbliyong
  • 关于c#中委托使用小结

      委托对与我们编程人员来说,一点都不陌生,在实际工作过程中,或多或少都应该是接触过

    小小许
  • 短信收发类无错版JustinIO.cs

    本文由来源 21aspnet,由 system_mush 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师...

    Java架构师必看
  • ASP.NET CORE Linux发布工具(文件对比 只上传差异文件;自动启停WebServer命令;上传完成自动预热WebServer)

    liulun
  • 剑指offer之面试题2:实现Singleton模式

    在上述代码中,Singleton1的静态属性Instance中,只有在instance为null的时候才创建一个实例以避免重复创建。

    Vincent-yuan

扫码关注云+社区

领取腾讯云代金券