动态菜单除了用反射就只能用CASE了吗?大家有什么好的经验 动态菜单除了用反射就只能用CASE了吗?大家有什么好的经验 switch (Module) { case "Main": ... break;难道除了反射,就只能像上面一样? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用字典 Dictionary<string, MyCommand> 。初始化的时候生成这个东西,处理的时候直接在字典里面找,找到了就执行就OK了。至于怎么生成这个字典,可以是配置文件,或者数据库,你喜欢怎么弄就怎么弄吧。 菜单列表是通过数据库存储的,已经可以动态自动生成列表现在可以用一个事件得到 点击菜单 的菜单名,是一个字符串,但是这个字符串可以就是需要访问的FORM的实例名称现在问的是除了 用反射外,还有什么方法? 直接用委托啊,我说的很清楚了。示意代码: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); }) }} 感谢楼上的思路,先定义一个公共的接口,所有的功能类都实现这个接口,然后需要在代码里,将所有的功能类注册为这个接口,不过还有以下问题:1.我的环境是WINFORM,是不是没有MVC的ACTION对象2.如果按楼上的代码所示,每增加一个菜单功能,还是需要在RegiterModules()硬编码? 1 Action 和 MVC 没有关系。WinForms 当然也能用。其实它就是 void delegate ADelegate()。2 可以在配置文件里面写,也可以硬编码。 那么是不是也就只有这几种情况:1.要么硬编码,直接生成菜单,或用工厂模式,或用CASE2.要么用反射如果像BS一样,能用字符串拼接出URL直接访问就好了 (1)工厂模式也是反射或者硬编码。(2)BS那个,其实也是反射,只是这部分由ASP.NET实现的。 求助,关于treeview添加节点数据库的数据 正则表达式读取匹配项 关于打包的问题 求救,Directory.Move操作后session丢失,在线急等 关于导出类问题! tclient.ReceiveBufferSize缓冲区大小的问题 【求助】【.net4.0无法登陆百度?】 c++里怎么调用C#写的dll组件? 关于C#的初学问题—————— 用C#做计数器! datagridview定位问题 菜鸟求助
至于怎么生成这个字典,可以是配置文件,或者数据库,你喜欢怎么弄就怎么弄吧。
菜单列表是通过数据库存储的,已经可以动态自动生成列表
现在可以用一个事件得到 点击菜单 的菜单名,是一个字符串,但是这个字符串可以就是需要访问的FORM的实例名称
现在问的是除了 用反射外,还有什么方法?
直接用委托啊,我说的很清楚了。示意代码: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); })
}
}
1.我的环境是WINFORM,是不是没有MVC的ACTION对象
2.如果按楼上的代码所示,每增加一个菜单功能,还是需要在RegiterModules()硬编码?
2 可以在配置文件里面写,也可以硬编码。
那么是不是也就只有这几种情况:
1.要么硬编码,直接生成菜单,或用工厂模式,或用CASE
2.要么用反射如果像BS一样,能用字符串拼接出URL直接访问就好了
(2)BS那个,其实也是反射,只是这部分由ASP.NET实现的。