C#反射使用方法過程及步驟
C#反射使用方法過程及步驟,供大家參考,具體內(nèi)容如下
1. 定義要訪問類的全名
2. 獲取該類的類型
3. 實例化該類
4. 獲取該類的字段、屬性,方法
5. 設(shè)置該字段或?qū)傩詢?nèi)容,或調(diào)用其方法
從而達到使用字符串訪問相應(yīng)類的目的。
示例:
1. 根據(jù)窗口類的名稱,產(chǎn)生一個新的窗口,相當于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;
// 由此達到使用類的字符串名生成一個該類的實例供后續(xù)程序的使用
2. 根據(jù)類的字符串名字,給該類的字段或?qū)傩再x值
//反射功能使用及步驟:以下示例為給字符串類名生成一個實例,并給該類的屬性或字段賦值
// 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中根據(jù)字符串產(chǎn)生的窗口類
pi.SetValue(customAaribleObj, customClassObj);
// 通過以上5個步驟,完成了根據(jù)字符串的名字,給相應(yīng)類的字段賦值
3. 根據(jù)類的字符串名字,讀取字段值,并使用該字段值(示例中,該字段值是窗體,該示例是銷毀該窗體)
// 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來判斷需要關(guān)閉那個窗口,這樣就會有很多的case語句,通過反射,就用示例3的6行代碼取代了,下面貼出原程序的代碼,目的是讓大家了解反射的作用:
// 被示例3取代的原代碼段(根據(jù)e.Panel.Name的值對相應(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. 針對 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必須轉(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;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C# DataGridView中實現(xiàn)勾選存儲數(shù)據(jù)和右鍵刪除數(shù)據(jù)(示例代碼)
這篇文章主要介紹了C# DataGridView中實現(xiàn)勾選存儲數(shù)據(jù)和右鍵刪除數(shù)據(jù)的示例代碼,通過示例代碼給大家展示運行效果圖,需要的朋友可以參考下2021-07-07
C#獲取Excel文件所有文本數(shù)據(jù)內(nèi)容的示例代碼
獲取上傳的?EXCEL?文件的所有文本信息并存儲到數(shù)據(jù)庫里,可以進一步實現(xiàn)對文件內(nèi)容資料關(guān)鍵字查詢的全文檢索,有助于我們定位相關(guān)文檔,本文詳細介紹了C#獲取Excel文件所有文本數(shù)據(jù)內(nèi)容實現(xiàn)步驟和代碼,需要的朋友可以參考下2024-07-07
C# WinForm中Panel實現(xiàn)用鼠標操作滾動條的實例方法
由于在WinForm中Panel不能直接響應(yīng)鼠標的滾動事件,只好采用捕獲窗體的滾動事件。2013-03-03

