C#反射使用方法過(guò)程及步驟
C#反射使用方法過(guò)程及步驟,供大家參考,具體內(nèi)容如下
1. 定義要訪問(wèn)類的全名
2. 獲取該類的類型
3. 實(shí)例化該類
4. 獲取該類的字段、屬性,方法
5. 設(shè)置該字段或?qū)傩詢?nèi)容,或調(diào)用其方法
從而達(dá)到使用字符串訪問(wèn)相應(yīng)類的目的。
示例:
1. 根據(jù)窗口類的名稱,產(chǎn)生一個(gè)新的窗口,相當(dāng)于new 窗口類
//1. 定義窗口類名稱:(窗口類的字符串名字,需要全路徑名,否則獲取不到TYPE) string customClassName = @"IBAutoDeal.IBDealForms." + hasPanel.Text; //2. 獲取字符串customClassName(某個(gè)窗口類的字符串名字)指定類的Type Type customClassType = Type.GetType(customClassName); //3. 生成指定Type的實(shí)例,相當(dāng)于new 類 object customClassObj = Activator.CreateInstance(customClassType); // 4. 對(duì)新生成的類進(jìn)行操作, 本例把new 出的窗口賦值給一個(gè)窗口變量 panelForm = customClassObj as Form; // 由此達(dá)到使用類的字符串名生成一個(gè)該類的實(shí)例供后續(xù)程序的使用
2. 根據(jù)類的字符串名字,給該類的字段或?qū)傩再x值
//反射功能使用及步驟:以下示例為給字符串類名生成一個(gè)實(shí)例,并給該類的屬性或字段賦值 // 1. 定義類名稱:(類的字符串名字,需要全路徑名,否則獲取不到TYPE) string customVaribleName = @"IBAutoDeal.IBDealClass.CommVar"; // 2. 獲取字符串 customVaribleName指定類的Type Type customVaribleType = Type.GetType(customVaribleName); // 3. 生成指定Type的實(shí)例,相當(dāng)于new 類 object customAaribleObj = Activator.CreateInstance(customVaribleType); // 4. 獲取該類字段,本例是給一個(gè)公共的窗體變量賦值,而該變量在此是字段 // 如果是給該類的屬性賦值,就需要使用 PropertyInfo pi = customVaribleType.GetField("v" + hasPanel.Text) // 在該類中,某個(gè)域是屬性還是字段呢?我個(gè)人的判斷是,若該域提供了GET,SET方法,就為屬性,否則為字段,也不知道正確否? FieldInfo pi = customVaribleType.GetField("v" + hasPanel.Text); // 5. 給該字段賦值,該字段是個(gè)窗口類變量,customClassObj就是示例1中根據(jù)字符串產(chǎn)生的窗口類 pi.SetValue(customAaribleObj, customClassObj); // 通過(guò)以上5個(gè)步驟,完成了根據(jù)字符串的名字,給相應(yīng)類的字段賦值
3. 根據(jù)類的字符串名字,讀取字段值,并使用該字段值(示例中,該字段值是窗體,該示例是銷毀該窗體)
// 1. 定義類名稱:(類的字符串名字,需要全路徑名,否則獲取不到TYPE) string customVaribleName = @"IBAutoDeal.IBDealClass.CommVar"; // 2. 獲取字符串 customVaribleName指定類的Type Type customVaribleType = Type.GetType(customVaribleName); // 3. 生成指定Type的實(shí)例,相當(dāng)于new 類 object customAaribleObj = Activator.CreateInstance(customVaribleType); // 4. 獲取該類字段,本例是給一個(gè)公共的窗體變量賦值,而該變量在此是字段 // 如果是給該類的屬性賦值,就需要使用 PropertyInfo pi = customVaribleType.GetField("v" + hasPanel.Text) // 在該類中,某個(gè)域是屬性還是字段呢?我個(gè)人的判斷是,若該域提供了GET,SET方法,就為屬性,否則為字段,也不知道正確否? FieldInfo pi = customVaribleType.GetField("v" + e.Panel.Name); // 5. 讀取該字段的值(本示例該字段值為窗體,讀取窗體變量,把銷毀該窗體) (pi.GetValue(customAaribleObj) as Form).Dispose(); // 6. 再為該字段賦空值 pi.SetValue(customAaribleObj, null);
4. 示例3原來(lái)是通過(guò)switch來(lái)判斷需要關(guān)閉那個(gè)窗口,這樣就會(huì)有很多的case語(yǔ)句,通過(guò)反射,就用示例3的6行代碼取代了,下面貼出原程序的代碼,目的是讓大家了解反射的作用:
// 被示例3取代的原代碼段(根據(jù)e.Panel.Name的值對(duì)相應(yīng)窗口關(guān)閉,并給公用變量賦值) switch (e.Panel.Name) { case "FrmAccountStatistics": CommVar.vFrmAccountStatistics.Dispose(); CommVar.vFrmAccountStatistics = null; break; case "frmPositionManager": CommVar.vfrmPositionManager.Dispose(); CommVar.vfrmPositionManager = null; break; case "frmTrader": CommVar.vfrmTrader.Dispose(); CommVar.vfrmTrader = null; break; case "frmLog": CommVar.vfrmLog.Dispose(); CommVar.vfrmLog = null; break; case "frmDataTransPlant": CommVar.vfrmDataTransPlate.Dispose(); CommVar.vfrmDataTransPlate = null; break; case "frmAccountTJ": CommVar.vfrmAccountTJ.Dispose(); CommVar.vfrmAccountTJ = null; break; case "frmGridViewConfig": CommVar.vfrmGridViewConfig.Dispose(); CommVar.vfrmGridViewConfig = null; break; case "frmTaticlistExcel": CommVar.vfrmTaticlistExcel.Dispose(); CommVar.vfrmTaticlistExcel = null; break; case "frmQuoteLst": CommVar.vfrmQuoteLst.Dispose(); CommVar.vfrmQuoteLst = null; break; case "frmProduct": CommVar.vfrmProduct.Dispose(); CommVar.vfrmProduct = null; break; default: break; }
5. 針對(duì) T 的泛類型定義的類,給屬性賦值示例代碼如下:
public static T ReadClass<T>(string pClassName) where T:class { //1. 定義類名稱:(因?yàn)橛袀魅氲腡類,所以不需要類的名稱了) //2.獲取類T的TYPE,注意,前面例子中是通過(guò)字符串取類型,使用的是Type.GetType() Type classType = typeof(T); //3. 生成指定 T 的實(shí)例,前面例子中,我們使用的是Activator.CreateInstance(classType) T ClassObj = Activator.CreateInstance<T>(); //4. 定義類的屬性變量,因程序要多次讀取不同的屬性,在此定義一個(gè)局部變量 PropertyInfo classPropertyInfo = null; string tableName = "TradeParameters"; //DataTable必須轉(zhuǎn)成DataView才能使用RowFilter DataTable vDt = DataTableHelper.ReadTable(tableName); DataView vDv = vDt.DefaultView; vDv.RowFilter = $"ClassName = '{pClassName}'"; if (vDv.Count > 0) { string pName, pVaule; foreach(DataRow dr in vDv) { pName = dr["AttributeName"].ToString(); pVaule = dr["AttributeValue"].ToString(); //5. 獲取指定名稱屬性 classPropertyInfo = classType.GetProperty(pName); if (classPropertyInfo != null) { //6. 給指定屬性賦值 classPropertyInfo.SetValue(ClassObj, pVaule); } } } return ClassObj; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C# WPF上位機(jī)實(shí)現(xiàn)和下位機(jī)TCP通訊的方法
這篇文章主要介紹了C# WPF上位機(jī)實(shí)現(xiàn)和下位機(jī)TCP通訊的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03C#實(shí)現(xiàn)Winform無(wú)邊框移動(dòng)的方法
這篇文章主要介紹了C#實(shí)現(xiàn)Winform無(wú)邊框移動(dòng)的方法,涉及C#針對(duì)WinForm窗口操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09c#中winform根據(jù)郵箱地址和密碼一鍵發(fā)送email的實(shí)現(xiàn)
本文主要介紹了c#winform根據(jù)郵箱地址和密碼一鍵發(fā)送email的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07詳解C#如何在不同工作簿之間復(fù)制選定單元格區(qū)域
處理Excel文檔時(shí),我們經(jīng)常需要將數(shù)據(jù)整合到一個(gè)工作表以便于我們進(jìn)行管理或數(shù)據(jù)對(duì)比。本文將演示如何通過(guò)編程方式將選定的單元格區(qū)域從一個(gè)工作簿復(fù)制到另一個(gè)工作簿2023-02-02關(guān)于c#二叉樹(shù)的實(shí)現(xiàn)
本篇文章小編為大家介紹,關(guān)于c#二叉樹(shù)的實(shí)現(xiàn)。需要的朋友參考下2013-04-04c#實(shí)現(xiàn)把異常寫入日志示例(異常日志)
這篇文章主要介紹了c#實(shí)現(xiàn)把異常寫入日志示例(異常日志),需要的朋友可以參考下2014-04-04