开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6805|回复: 5
打印 上一主题 下一主题
收起左侧

[C#作业] 第二十五天作业

[复制链接]
跳转到指定楼层
发表于 2019-5-5 16:38:43 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式   广东省揭阳市

今日主要学习内容**

25.1 对话框 - MessageBox 与 自定义对话框
25.2 对话框 - 常用对话框类使用案例
25.3 菜单 - MenuStrip 基本使用 单选菜单实现
25.4 菜单 - MenuStrip 反射实现插件机制动态加载菜单

今日作业

  1. 使用反射实现插件机制动态加载2级菜单及调用

提示:考虑如何存储子菜单名称与对应方法 , 看看字典结构是否适用

图例
地下
发表于 2019-7-3 00:03:34 | 只看该作者   湖南省长沙市
后天休息慢慢写吧,看完一时半会还消化不了emmmmmmm
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
地板
发表于 2019-6-15 13:14:04 | 只看该作者   江苏省南京市
曜石头 发表于 2019-6-13 16:12
我在接口中定义dictionary 在类库中实现就会报错
烦恼,苦闷,太难啦

        Dictionary<string, Func<string, string>> DicInit();
}
//dll
namespace EditExtPlugIntest{
    public class EditExt : IEditExt{
        public string Title => "插件1";
        Dictionary<string, Func<string, string>> dic = new Dictionary<string, Func<string, string>>();
        Func<string, string> func ;
        public Dictionary<string, Func<string, string>> DicInit(){
            dic.Add("功能1", func = str => str + "功能1");
            dic.Add("功能2", func = str => str + "功能2");
            return dic;
        }
    }
}
//程序
public partial class FrmPlugin : Form{
        public FrmPlugin(){
            InitializeComponent();
        }
        Dictionary<string, Func<string, string>> dic;
        private void FrmPlugin_Load(object sender, EventArgs e){        
            string[] files = Directory.GetFiles(Application.StartupPath, "*.dll");
            foreach (var file in files){
                Assembly ass = Assembly.LoadFile(file);
                Type[] types = ass.GetTypes();//获取程序集中所有类信息
                foreach (var type in types){   
                    if (typeof(IEditExt).IsAssignableFrom(type)){
                        ConstructorInfo ct = type.GetConstructor(new Type[0]);
                        IEditExt editex = (IEditExt)ct.Invoke(new object[0]);
                        ToolStripMenuItem item = new ToolStripMenuItem();//动态创建一级菜单
                        mitemPlugin.DropDownItems.AddRange(new ToolStripItem[] {item});
                        item.Text = editex.Title;
                        dic = editex.DicInit();//获取委托
                        foreach (var ditem in dic){
                            ToolStripMenuItem item1 = new ToolStripMenuItem();//动态创建二级菜单
                            item.DropDownItems.AddRange(new ToolStripItem[] { item1 });
                            item1.Text = ditem.Key;
                            item1.Click += Item1_Click;
                            item1.Tag = editex;
                        }  
                    }
                }
            }
        }
        private void Item1_Click(object sender, EventArgs e){//事件
            string str = sender.ToString();
            string str1 = dic[str]("abcdefg");
            MessageBox.Show(str1);
        }
}

现在加上委托,调用dll已知的程序加载函数就能将插件中所有方法加载到窗口上,这样能随意调用dll中任何定义好的函数,这样的插件还有点意思

评分

参与人数 1好评 +1 精币 +20 收起 理由
老郭 + 1 + 20 很好很强悍,坚持下去哦~

查看全部评分

回复 支持 反对

使用道具 举报

板凳
发表于 2019-6-13 16:16:04 | 只看该作者   浙江省杭州市
签到一下 签到一下 滴滴滴滴
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
沙发
发表于 2019-6-13 16:12:23 | 只看该作者   江苏省南京市



我在接口中定义dictionary 在类库中实现就会报错
烦恼,苦闷,太难啦
回复 支持 反对

使用道具 举报

楼主
发表于 2019-5-7 10:46:39 | 只看该作者   重庆市重庆市
用字典Dictionary<string, IEditExt>取代了item.Tag的绑定IEditExt。。key=二级菜单名字,value=对应方法。。。不知道和提示是不是一个意思。。。 task25zx61.rar (492.97 KB, 下载次数: 1)



//接口
namespace Task
{
    public interface IEditExt
    {
        string FirstTitle { get; }
        string SecondTitle { get; }
        string SendText(string str);

    }

}

//form
namespace Task
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Dictionary<string, IEditExt> dic = new Dictionary<string, IEditExt>();
        private void Form1_Load(object sender, EventArgs e)
        {

            string[] files = Directory.GetFiles(Application.StartupPath + @"\plugins", "*.dll");

            foreach (var file in files)
            {
                Assembly ass = Assembly.LoadFile(file);
                Type[] types = ass.GetTypes();

                foreach (var type in types)
                {
                    if (typeof(IEditExt).IsAssignableFrom(type))
                    {
                        ConstructorInfo ct = type.GetConstructor(new Type[0]);
                        IEditExt editex = (IEditExt)ct.Invoke(new object[0]);
                        if (editex.FirstTitle == "一级菜单1")
                        {
                            ToolStripItem item = MItemfirst.DropDownItems.Add(editex.SecondTitle);
                            dic.Add(editex.SecondTitle, editex);
                            item.Click += Item_Click;
                        }
                    }
                }
            }
        }

        private void Item_Click(object sender, EventArgs e)
        {
            ToolStripItem item = (ToolStripItem)sender;
            foreach (KeyValuePair<string, IEditExt> item1 in dic)
            {
                if (item1.Key==item.Text) {
                    IEditExt edit = item1.Value;
                    string str = edit.SendText("abcdefg");
                    MessageBox.Show(str);
                }
            }
        }
    }
}


//dll
namespace EditExtPluginTask1
{

    public class EditExt1 : IEditExt
    {
        public string FirstTitle => "一级菜单1";
        public string SecondTitle => "二级菜单1";
        public string SendText(string str)
        {
            return str + "1";
        }
    }

    public class EditExt2 : IEditExt
    {
        public string FirstTitle => "一级菜单1";
        public string SecondTitle => "二级菜单2";
        public string SendText(string str)
        {
            return str + "2";
        }
        }
    }

评分

参与人数 1好评 +1 精币 +2 收起 理由
老郭 + 1 + 2 字典中可以利用委托

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:[email protected]
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表