日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#反射使用方法过程及步骤

發布時間:2024/8/26 C# 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#反射使用方法过程及步骤 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C#反射使用方法過程及步驟

1. 定義要訪問類的全名

2. 獲取該類的類型

3. 實例化該類

4. 獲取該類的字段、屬性,方法

5. 設置該字段或屬性內容,或調用其方法

從而達到使用字符串訪問相應類的目的。

示例:

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才能使用RowFilterDataTable 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;}

總結

以上是生活随笔為你收集整理的C#反射使用方法过程及步骤的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。