动态菜单除了用反射就只能用CASE了吗?大家有什么好的经验
            switch (Module)
            {
                case "Main": 
                 ...
                break;难道除了反射,就只能像上面一样?

解决方案 »

  1.   

    用字典 Dictionary<string, MyCommand> 。初始化的时候生成这个东西,处理的时候直接在字典里面找,找到了就执行就OK了。
    至于怎么生成这个字典,可以是配置文件,或者数据库,你喜欢怎么弄就怎么弄吧。
      

  2.   


    菜单列表是通过数据库存储的,已经可以动态自动生成列表
    现在可以用一个事件得到 点击菜单 的菜单名,是一个字符串,但是这个字符串可以就是需要访问的FORM的实例名称
    现在问的是除了 用反射外,还有什么方法?
      

  3.   


    直接用委托啊,我说的很清楚了。示意代码:interface IModule
    {
        public string Name { get; }
        public Action OnCommad { get; }
    }class Module1 : IModule
    {
        public string Name { get { return "ShowMessage"; } }
        public Action OnCommad { get { return () => { MessageBox.Show("Hello!"); } } }
    }class Module2 : IModule
    {
        public string Name { get { return "Print"; } }
        public Action OnCommad { get { return () => { Printer.Print(...); } } }
    }class Form
    {
        List<IModule> RegiterModules()
        {
            return new List<IModule>() { (IModule)(new Module1()), (IModule)(new Module2()) };
        }
        void Form_Load()
        {
            var list = RegiterModules();
            list.ForEach((x) => 
                { MenuItem mi = new MenuItem();
                  mi.Text = x.Name;
                  mi.Click += (o1, e1) => x.OnCommand(); 
                  Menu.Items.Add(mi); })
        }
    }
      

  4.   

    感谢楼上的思路,先定义一个公共的接口,所有的功能类都实现这个接口,然后需要在代码里,将所有的功能类注册为这个接口,不过还有以下问题:
    1.我的环境是WINFORM,是不是没有MVC的ACTION对象
    2.如果按楼上的代码所示,每增加一个菜单功能,还是需要在RegiterModules()硬编码?
      

  5.   

    1 Action 和 MVC 没有关系。WinForms 当然也能用。其实它就是 void delegate ADelegate()。
    2 可以在配置文件里面写,也可以硬编码。
      

  6.   


    那么是不是也就只有这几种情况:
    1.要么硬编码,直接生成菜单,或用工厂模式,或用CASE
    2.要么用反射如果像BS一样,能用字符串拼接出URL直接访问就好了
      

  7.   

    (1)工厂模式也是反射或者硬编码。
    (2)BS那个,其实也是反射,只是这部分由ASP.NET实现的。