C# 动态加载控件 (转)
不错的文章
控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员调用,更重要的是它还可以实现插件式开发,使软件的灵活性、可扩充 性大大增强。在网络上,也有很多动态加载控件、动态调用类成员等的资料。
动态加载,最基本用到的就是反射机制。在System.Reflection的namespace下有一系列的关于获取Assembly信息、类(型)信息 的类、接口、结构等。可能上面的话对急切想实现动态加载控件的朋友来说可能一点用也没有,那么就看下面的代码吧,也许可以使你马上实现你想要的:
1.加载控件
Assembly assembly = Assembly.LoadFrom(@"C:Controls.dll");
2.获得类(型)
Type type = assembly.GetType("Controls.UserControl",false,true);
3.设置筛选标志
BindingFlags bflags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
4.调用构造函数并获得对象
Object obj = type.InvokeMember("UserControl", bflags | BindingFlags.CreateInstance, null, null, null);
5.将对象转换类型
System.Windows.Forms.Control control = (Control)obj;
6.将控件添加到窗体
this.Controls.Add(control);
====================================================================================
下面对上面程序段用到的一些变量、方法做一点说明
1.BindingFlags 枚举类型
BindingFlags.Instance : 对象实例
BindingFlags.Static : 静态成员
BindingFlags.Public : 指可在搜索中包含公共成员
BindingFlags.NonPublic : 指可在搜索中包含非公共成员(即私有成员和受保护的成员)
BindingFlags.FlattenHierarchy : 指可包含层次结构上的静态成员
BindingFlags.IgnoreCase : 表示忽略 name 的大小写
BindingFlags.DeclaredOnly : 仅搜索 Type 上声明的成员,而不搜索被简单继承的成员
BindingFlags.CreateInstance : 表示调用构造函数。忽略 name。对其他调用标志无效
2.Type.InvokeMember
public object InvokeMember(
string name,
BindingFlags invokeAttr,
Binder binder,
object target,
object[] args
);
参数
name
String,它包含要调用的构造函数、方法、属性或字段成员的名称。 或 空字符串 (""),表示调用默认成员。
invokeAttr
一 个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。 访问可以是 BindingFlags 之一,如Public、 NonPublic、Private、 InvokeMethod 和 GetField 等。不需要指定查找类型。如果省略查找类型, 则将应用 BindingFlags.Public | BindingFlags.Instance。
binder
一个 Binder 对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、 强制参数类型和通过反射调用成 员。 - 或 - 若为空引用(Visual Basic 中为 Nothing),则使用 DefaultBinder。
target 要在其上调用指定成员的 Object。
args 包含传递给要调用的成员的参数的数组。
返回值 表示被调用成员的返回值的 Object。