實現運行時從字符串動態創建對象
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程序集。
國內最大的酷站演示中心!