原 数据字典+匿名委托模拟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 条评论
登录 后参与评论

相关文章

来自专栏cs

c sharp 的输入,输入,switch语句。

31250
来自专栏跟着阿笨一起玩NET

C# 4.0命名参数和可选参数

Named And Optional Arguments - 命名参数和可选参数

7810
来自专栏菩提树下的杨过

DataTable排序结果的纠正

默认情况下,即便db中某一列的值是数字,查询出来的DataSet/DataTable里,Column的类型都是String型,所以当用dataTable.Def...

22290
来自专栏跟着阿笨一起玩NET

跨线程的安全更新控件

8820
来自专栏Netkiller

使用 HttpClient 调用 Restful 接口

本文节选自《Netkiller Java 手札》 import java.io.IOException; import org.apache.http.Htt...

41960
来自专栏C#

C#的DataTable操作方法

1.将泛型集合类转换成DataTable(表中无数据时使用): public static DataTable NullListToDataTable(IL...

29070
来自专栏vue

.net里面的字典Dictionary

11020
来自专栏.net core新时代

List,DataTable实现行转列的通用方案

  最近在做报表统计方面的需求,涉及到行转列报表。根据以往经验使用SQL可以比较容易完成,这次决定挑战一下直接通过代码方式完成行转列。期间遇到几个问题和用到的新...

25470
来自专栏c#开发者

向datagrid中加横向 纵向的合计 (在datatable中实现,datatable间倒数据)

如果实现?? protected System.Web.UI.WebControls.DataGrid DataGrid1; /// <summary>...

516120
来自专栏跟着阿笨一起玩NET

把DataTable 转换成Json格式,适用于EasyUI 绑定DataGrid

本文转载:http://www.cnblogs.com/liang--liang/archive/2013/02/05/2893030.html

17020

扫码关注云+社区

领取腾讯云代金券