利用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);//这里是一个存放按钮的容器 } }
利用反射动态加载程序集中所有的继承于Form的子类,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/TopC/p/3817670.html