日韩欧美人妻无码精品白浆,夜夜嗨AV免费入口,国产欧美官网在线看,高校回应聋哑女生因长相完美被质疑

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#利用反射動(dòng)態(tài)創(chuàng)建對(duì)象 帶參數(shù)的構(gòu)造函數(shù)和String類型

admin
2017年4月5日 0:36 本文熱度 7074
最近筆者有一個(gè)想法需要利用反射動(dòng)態(tài)創(chuàng)建對(duì)象(如string,int,float,bool,以及自定義類等)來(lái)實(shí)現(xiàn),一直感覺反射用不好,特別是當(dāng)構(gòu)造函數(shù)帶參數(shù)的時(shí)候。
MSDN上給出的例子十分復(fù)雜,網(wǎng)上的帖子則一般都說很簡(jiǎn)單,那就看看網(wǎng)上比較普遍的說法:

01.“反射”其實(shí)就是利用程序集的元數(shù)據(jù)信息。
02. 
03.反射可以有很多方法,編寫程序時(shí)請(qǐng)先導(dǎo)入 System.Reflection 命名空間,假設(shè)你要反射一個(gè) DLL 中的類,并且沒有引用它(即未知的類型):
04.Assembly assembly = Assembly.LoadFile("程序集路徑,不能是相對(duì)路徑"); // 加載程序集(EXE 或 DLL)
05.object obj = assembly.CreateInstance("類的完全限定名(即包括命名空間)"); // 創(chuàng)建類的實(shí)例
06. 
07.若要反射當(dāng)前項(xiàng)目中的類可以為:
08. 
09.Assembly assembly = Assembly.GetExecutingAssembly(); // 獲取當(dāng)前程序集
10.object obj = assembly.CreateInstance("類的完全限定名(即包括命名空間)"); // 創(chuàng)建類的實(shí)例,返回為 object 類型,需要強(qiáng)制類型轉(zhuǎn)換
11. 
12.也可以為:
13.Type type = Type.GetType("類的完全限定名");
14.object obj = type.Assembly.CreateInstance(type);
15. 
16.反射創(chuàng)建類的實(shí)例

因?yàn)檫@段描述在很多地方都有看到,筆者也不知道原始出處,所以這里就給出筆者第一次看到的地方:http://hi.baidu.com/rayord/item/92e58ddb0d34c13de3108fbb

上述描述中提到的三種方法其實(shí)都是大同小異的,核心就是通過System.Reflection.Assembly 類型的CreateInstance方法創(chuàng)建實(shí)例。

關(guān)于System.Reflection.Assembly 類可以直接在MSDN上查詢?cè)敿?xì)信息http://msdn.microsoft.com/zh-cn/library/system.reflection.assembly(v=vs.110).aspx

那么簡(jiǎn)單的解釋一下這種方法的原理:

1.找到要實(shí)例化的類所在的程序集,并將之實(shí)例為System.Reflection.Assembly 類的對(duì)象

2.利用System.Reflection.Assembly 類提供的CreateInstance方法,創(chuàng)建類的對(duì)象

看起來(lái)確實(shí)很簡(jiǎn)單,只是這種方法真的好用么?

筆者進(jìn)行了測(cè)試以說明:

第一次測(cè)試,創(chuàng)建一個(gè)簡(jiǎn)單的自定義類型對(duì)象

首先創(chuàng)建一個(gè)類:


01.class Test
02.{
03.private string _strId;
04.public string ID
05.{
06.get return _strId; }
07.set { _strId = value; }
08.}
09. 
10.public Test()
11.{
12.}
13.}

然后在主函數(shù)中加入代碼:

Assembly assembly = Assembly.GetExecutingAssembly(); // 獲取當(dāng)前程序集 
object obj = assembly.CreateInstance("ReflectionTest.Test"); //類的完全限定名(即包括命名空間)

調(diào)試結(jié)果:顯示obj對(duì)象的確不為空,證明這種方法可行。

第二次測(cè)試,加深難度,測(cè)試類的構(gòu)造函數(shù)需要傳遞參數(shù)
首先修改Test類,將其構(gòu)造函數(shù)改為:

public Test(string str)
{
     _strId = str;
}

調(diào)試結(jié)果:直接拋出異常:未找到類型“ReflectionTest.Test”上的構(gòu)造函數(shù)。這是因?yàn)镃reateInstance方法默認(rèn)情況下是通過找無(wú)參數(shù)的構(gòu)造函數(shù)去創(chuàng)建對(duì)象的,現(xiàn)在找不到當(dāng)然會(huì)出錯(cuò),實(shí)時(shí)上CreateInstance方法提供了3中簽名,其中有CreateInstance(String, Boolean, BindingFlags, Binder, Object [], CultureInfo, Object []) 就可以滿足這種情況:

修改主函數(shù)如下:


1.Assembly assembly = Assembly.GetExecutingAssembly(); // 獲取當(dāng)前程序集
2.//object obj = assembly.CreateInstance("ReflectionTest.Test"); //類的完全限定名(即包括命名空間)
3.object[] parameters = new object[1];
4.parameters[0] = "test string";
5.object obj = assembly.CreateInstance("ReflectionTest.Test",true,System.Reflection.BindingFlags.Default,null,parameters,null,null);// 創(chuàng)建類的實(shí)例

調(diào)試結(jié)果:正常,并且對(duì)象中變量值也是正確的,但是這離筆者的需求還差很遠(yuǎn)。繼續(xù)
第三次測(cè)試,繼續(xù)加深難度,創(chuàng)建string的對(duì)象

首先知道string是System.String的別名,所以要?jiǎng)?chuàng)建的是System.String的對(duì)象,而System.String在mscorlib.dll中,所以需要將mscorlib.dll實(shí)例為System.Reflection.Assembly的對(duì)象,這里利用System.Type類型的屬性Assembly來(lái)實(shí)現(xiàn)功能。

System.String的構(gòu)造函數(shù)有很多種,本文中筆者就不墨跡了,采用String( Char []) 。

最終將主函數(shù)中代碼改為:


1.Type type = Type.GetType("System.String");
2.object[] parameters = new object[1];
3.char[] lpChar = { ''t'',''e'',''s'',''t'' };
4.parameters[0] = lpChar;
5. 
6.object obj = type.Assembly.CreateInstance("ReflectionTest.Test",true,System.Reflection.BindingFlags.Default,null,parameters,null,null);// 創(chuàng)建類的實(shí)例

調(diào)試結(jié)果:對(duì)象為空,失敗了,事實(shí)上這種方法還有個(gè)問題,如將Test類構(gòu)造函數(shù)修改為
 

1.public Test(string str)
2.{
3.ID = str;//屬性賦值
4.}

調(diào)試結(jié)果:對(duì)象創(chuàng)建成功,但是變量為空

以上問題詳細(xì)原因筆者現(xiàn)在也無(wú)法解釋,正在查找相關(guān)資料。

解決方案
 

采用System.Activator 類的CreateInstance方法。

最后見代碼:


1.Type type = Type.GetType("System.String");
2.object[] parameters = new object[1];
3.char[] lpCh = { ''t''''e''''s''''t'' };
4.parameters[0] = lpCh;
5. 
6.object obj = Activator.CreateInstance(type, parameters);

調(diào)試結(jié)果:對(duì)象創(chuàng)建成功,且變量值正常

結(jié)論

采用System.Activator 類的CreateInstance方法,要比System.Reflection.Assembly的CreateInstance簡(jiǎn)單有效很多。有興趣的朋友可以仔細(xì)看看。


該文章在 2017/4/5 0:36:30 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved