您好,登錄后才能下訂單哦!
C#反射使用方法過程及步驟是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
1. 根據窗口類的名稱,產生一個新的窗口,相當于new 窗口類
//1. 定義窗口類名稱:(窗口類的字符串名字,需要全路徑名,否則獲取不到TYPE) string customClassName = @"IBAutoDeal.IBDealForms." + hasPanel.Text; //2. 獲取字符串customClassName(某個窗口類的字符串名字)指定類的Type Type customClassType = Type.GetType(customClassName); //3. 生成指定Type的實例,相當于new 類 object customClassObj = Activator.CreateInstance(customClassType); // 4. 對新生成的類進行操作, 本例把new 出的窗口賦值給一個窗口變量 panelForm = customClassObj as Form; // 由此達到使用類的字符串名生成一個該類的實例供后續程序的使用
2. 根據類的字符串名字,給該類的字段或屬性賦值
//反射功能使用及步驟:以下示例為給字符串類名生成一個實例,并給該類的屬性或字段賦值 // 1. 定義類名稱:(類的字符串名字,需要全路徑名,否則獲取不到TYPE) string customVaribleName = @"IBAutoDeal.IBDealClass.CommVar"; // 2. 獲取字符串 customVaribleName指定類的Type Type customVaribleType = Type.GetType(customVaribleName); // 3. 生成指定Type的實例,相當于new 類 object customAaribleObj = Activator.CreateInstance(customVaribleType); // 4. 獲取該類字段,本例是給一個公共的窗體變量賦值,而該變量在此是字段 // 如果是給該類的屬性賦值,就需要使用 PropertyInfo pi = customVaribleType.GetField("v" + hasPanel.Text) // 在該類中,某個域是屬性還是字段呢?我個人的判斷是,若該域提供了GET,SET方法,就為屬性,否則為字段,也不知道正確否? FieldInfo pi = customVaribleType.GetField("v" + hasPanel.Text); // 5. 給該字段賦值,該字段是個窗口類變量,customClassObj就是示例1中根據字符串產生的窗口類 pi.SetValue(customAaribleObj, customClassObj); // 通過以上5個步驟,完成了根據字符串的名字,給相應類的字段賦值
3. 根據類的字符串名字,讀取字段值,并使用該字段值(示例中,該字段值是窗體,該示例是銷毀該窗體)
// 1. 定義類名稱:(類的字符串名字,需要全路徑名,否則獲取不到TYPE) string customVaribleName = @"IBAutoDeal.IBDealClass.CommVar"; // 2. 獲取字符串 customVaribleName指定類的Type Type customVaribleType = Type.GetType(customVaribleName); // 3. 生成指定Type的實例,相當于new 類 object customAaribleObj = Activator.CreateInstance(customVaribleType); // 4. 獲取該類字段,本例是給一個公共的窗體變量賦值,而該變量在此是字段 // 如果是給該類的屬性賦值,就需要使用 PropertyInfo pi = customVaribleType.GetField("v" + hasPanel.Text) // 在該類中,某個域是屬性還是字段呢?我個人的判斷是,若該域提供了GET,SET方法,就為屬性,否則為字段,也不知道正確否? FieldInfo pi = customVaribleType.GetField("v" + e.Panel.Name); // 5. 讀取該字段的值(本示例該字段值為窗體,讀取窗體變量,把銷毀該窗體) (pi.GetValue(customAaribleObj) as Form).Dispose(); // 6. 再為該字段賦空值 pi.SetValue(customAaribleObj, null);
4. 示例3原來是通過switch來判斷需要關閉那個窗口,這樣就會有很多的case語句,通過反射,就用示例3的6行代碼取代了,下面貼出原程序的代碼,目的是讓大家了解反射的作用:
// 被示例3取代的原代碼段(根據e.Panel.Name的值對相應窗口關閉,并給公用變量賦值) 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. 針對 T 的泛類型定義的類,給屬性賦值示例代碼如下:
public static T ReadClass<T>(string pClassName) where T:class { //1. 定義類名稱:(因為有傳入的T類,所以不需要類的名稱了) //2.獲取類T的TYPE,注意,前面例子中是通過字符串取類型,使用的是Type.GetType() Type classType = typeof(T); //3. 生成指定 T 的實例,前面例子中,我們使用的是Activator.CreateInstance(classType) T ClassObj = Activator.CreateInstance<T>(); //4. 定義類的屬性變量,因程序要多次讀取不同的屬性,在此定義一個局部變量 PropertyInfo classPropertyInfo = null; string tableName = "TradeParameters"; //DataTable必須轉成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; }
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。