欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年09月26日 17:39:59   作者:紅目香薰  
這篇文章主要為大家詳細介紹了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é)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C# WPF上位機實現(xiàn)和下位機TCP通訊的方法

    C# WPF上位機實現(xiàn)和下位機TCP通訊的方法

    這篇文章主要介紹了C# WPF上位機實現(xiàn)和下位機TCP通訊的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • C#實現(xiàn)Winform無邊框移動的方法

    C#實現(xiàn)Winform無邊框移動的方法

    這篇文章主要介紹了C#實現(xiàn)Winform無邊框移動的方法,涉及C#針對WinForm窗口操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • c#中winform根據(jù)郵箱地址和密碼一鍵發(fā)送email的實現(xiàn)

    c#中winform根據(jù)郵箱地址和密碼一鍵發(fā)送email的實現(xiàn)

    本文主要介紹了c#winform根據(jù)郵箱地址和密碼一鍵發(fā)送email的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • C# 操作符之三元操作符淺析

    C# 操作符之三元操作符淺析

    C# 操作符之三元操作符“?:”是如何使用的呢?C# 操作符之三元操作符“?:”需要注意的是什么呢?那么本文就向你簡單介紹C# 操作符之三元操作符“?:”的基本情況。
    2011-02-02
  • C#中使用Split方法拆分字符串實例

    C#中使用Split方法拆分字符串實例

    這篇文章主要介紹了C#中使用Split方法拆分字符串實例,本文給出了使用一個分隔符和多個分隔符拆分字符串的例子,需要的朋友可以參考下
    2014-08-08
  • C#從命令行讀取參數(shù)的方法

    C#從命令行讀取參數(shù)的方法

    這篇文章主要介紹了C#從命令行讀取參數(shù)的方法,實例分析了C#命令行讀取參數(shù)的實現(xiàn)技巧與操作流程,需要的朋友可以參考下
    2015-04-04
  • 詳解C#如何在不同工作簿之間復(fù)制選定單元格區(qū)域

    詳解C#如何在不同工作簿之間復(fù)制選定單元格區(qū)域

    處理Excel文檔時,我們經(jīng)常需要將數(shù)據(jù)整合到一個工作表以便于我們進行管理或數(shù)據(jù)對比。本文將演示如何通過編程方式將選定的單元格區(qū)域從一個工作簿復(fù)制到另一個工作簿
    2023-02-02
  • 關(guān)于c#二叉樹的實現(xiàn)

    關(guān)于c#二叉樹的實現(xiàn)

    本篇文章小編為大家介紹,關(guān)于c#二叉樹的實現(xiàn)。需要的朋友參考下
    2013-04-04
  • C#實現(xiàn)中文日歷Calendar

    C#實現(xiàn)中文日歷Calendar

    這篇文章介紹了C#實現(xiàn)中文日歷Calendar的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • c#實現(xiàn)把異常寫入日志示例(異常日志)

    c#實現(xiàn)把異常寫入日志示例(異常日志)

    這篇文章主要介紹了c#實現(xiàn)把異常寫入日志示例(異常日志),需要的朋友可以參考下
    2014-04-04

最新評論