利用反射动态加载程序集中所有的继承于Form的子类

利用C# 的反射,能够轻松快捷的创建指定类型的未知对象,比如继承某个接口的类,继承于某个基类的子类.

 

问题场景:

我自己创建一个解决方案,这个方案里面放了很多的小工具,每一个工具都是一个小窗体,于是,我就用一个MID窗体来包含这些窗体.

 

这样问题就来了,每一次我添加一个小工具,我就必须在MID窗体里面添加一个按钮,或者是一个菜单.在事件写上,让某个窗体显示出来.这类无聊的语句.

 

那么能不能让程序自动查找程序集中的窗体,自动创建按钮,或者菜单.

 

这样就可以达到动态创建的目的了

 

解决方案:

 

假设我们要查找程序集中的继承Form的类.

关键语句:

 

var simpleTypes = from t in Assembly.GetExecutingAssembly().GetTypes()        
where (t.BaseType == typeof(Form) || t.BaseType .BaseType ==typeof(Form)) select t;

这个语句就是查找继承Form的类,或者是基类继承Form的类.

(功能还不完善,无法查找出太多层次继承的类)这样我们便找到了程序集中的所有Form的子类.

 

那么如何实现点击时,创建一个指定的类呢?

 

一个类只要这样就行了.

Assembly.GetExecutingAssembly().CreateInstance(Class.FullName) as Form

  

好了,我们将所有找到类存放在一个Dictionary对象中,Key是对象的名称,Value是一个委托.

只要用关键字在Dictionary查找,调用委托,即可创建一个Form实例.

 

下面是全部代码.

static class Program    {

         /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            
            CreateForms();
            Application.Run(new FrmMain());
           
        }



 private static void CreateForms()
        {

            var simpleTypes = from t in Assembly.GetExecutingAssembly().GetTypes() 
                              where (t.BaseType == typeof(Form) || t.BaseType .BaseType ==typeof(Form))
                              select t;
            foreach ( var simpleType in simpleTypes)
            {
                _FormTypes.Add(simpleType.Name, simpleType);
                _Dictionary.Add(simpleType.Name, (key) => _Assembly.CreateInstance(_FormTypes[key].FullName) as Form);
            }
           
        }
 private static Dictionary<string, Type> _FormTypes = new Dictionary<string, Type>();

        private static Dictionary<string, Func<string, Form>> _Dictionary =
            new Dictionary<string, Func<string, Form>>(); 

        static Assembly _Assembly= Assembly.GetExecutingAssembly();

     

        public static Dictionary<string, Func<string, Form>> Forms
        {
            get { return _Dictionary; }
        }

}

调用方法:

 

 private void CreateButton()
        {
            foreach (var key in Program.Forms.Keys)
            {
                var button = new Button {Text = key, AutoSize = true};
                button.Click += (sender, e) =>
                {
                    var obj = sender as Button;
                    if (obj != null)
                    {
                        var func = Program.Forms[obj.Text];
                        var form = func(obj.Text);
                        form.Show();
                    }
                };

                flowLayoutPanel2.Controls.Add(button);//这里是一个存放按钮的容器
            }
        }

 

转载于:https://www.cnblogs.com/TopC/p/3817670.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值