实现运行时从字符串动态创建对象
2024-07-21 02:19:46
供稿:网友
在运行时任意指定对象的创建类型,甚至是用表示类型的名字的字符串创建所需的对象,.net framwork的反射机制给我们带来了解决问题的方法。这里,若只需要创建一般的对象,我们可以通过system.activator来实现,而较复杂的我们可以通过获取构造方法来实现。
反射reflection是.net中重要机制,通过反射,可以在运行时获得.net中每一个类型(包括类、结构、委派、接口、枚举)的成员,包括方法、属性、事件以及构造函数等,还可以获得每个成员的名称、限定符和参数等,有了反射,就可以对每一个类型了如指掌。如果获得了构造函数的信息,就可以直接创建对象,即使这个对象的类型在编译的时候还不知道。
/// <summary>
/// createnewcontrols 根据空间的名称,类型字符串,大小、位置去动态的生成一个控件
/// </summary>
/// <param name="targetcontrol"> 控件加载到的容器</param>
/// <param name="ctlname">生成的控件实例名称</param>
/// <param name="ctltype">生成的控件类型字符串如(textbox、button等)</param>
/// <param name="ctlsize">控件的大小</param>
/// <param name="ctllocation">控件的位置</param>
/// <returns>生成的控件实例</returns>
private control createnewcontrols(control.controlcollection targetcontrol,string ctlname,type ctltype, system.drawing.size ctlsize,system.drawing.point ctllocation)
{
control tocreate;
tocreate = (control)system.activator.createinstance(ctltype);
tocreate.name = ctlname;
tocreate.size = ctlsize;
tocreate.location = ctllocation;
targetcontrol.add(tocreate);
return tocreate;
}
size cbsize = new size(160,40);
point cbpoint = new point(64,206);
control c1 = createnewcontrols(this.controls,"control1",type.gettype("system.windows.forms.checkbox, system.windows.forms, version=1.0.5000.0, culture=neutral, publickeytoken=b77a5c561934e089"),cbsize,cbpoint);
c1.text =" check box";
.ne tframework 1.1上,type.gettype("system.windows.forms.checkbox, system.windows.forms,version=1.0.5000.0,culture=neutral, publickeytoken=b77a5c561934e089")。
我们如何取得所用windows.form程序集的版本和强名称?可以用gettype(checkbox).assemblyqualifiedname这样的语法,一旦得到了这些信息,我们就可以将这些信息用于其它任何控件,因为他们都来自于同一个版本windows.forms程序集。
国内最大的酷站演示中心!