程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【點滴積累】在C#中使用反射動態調用類型成員

【點滴積累】在C#中使用反射動態調用類型成員

編輯:C#入門知識

1.背景

  學習C#的時候就知道使用反射可以對我們編程提供極大的便利(動態的獲取信息、調用類型成員、創建實例等等),但是在實際的工作中直接使用反射的機會比較少,有印象的就是一次自己做的WinForms小工具的時候利用反射來動態獲取窗體上的每個控件,並且為必要的控件動態添加注冊事件。因為剛入職新公司,為了更快的了解公司的業務、和開發習慣,先和現在公司同事一起修改現有系統的一些小Bug。在Tester提交的Bug中有一個是對GridView進行動態的排序——點擊一個列時使用該列作為條件進行排序(PS:點擊一個列時前台會將該列的字符串(該字符串是)傳到後台的方法中)。

 

2.使用反射的原因

  為什麼會選擇使用反射呢?在項目中我們使用NHibernate作為ORM框架,一般情況下在BLL層其實都提供了對應的排序方法,但是現在需要修改的這個Bug使用的數據不是在一張表裡面,而是一個視圖。如果按照以前排序功能實現模式的話,需要在多個地方進行修改;且由於是剛接觸這個項目,對項目的結構還不夠了解,不宜進行大面積的修改。和同事溝通後決定使用反射來實現。理由如下:

  • 因為是直接對已經從數據庫返回的結果進行排序,所有只需要在一個地方修改(BLL層)
  • 雖然使用反射會增加性能上的開銷,但是在這個場景數據量並不大,性能上的消耗可以忽略不計

 

3.使用反射動態調用代碼

  反射給人感覺好像很復雜,其實使用起來還是比較方便的,由於項目中代碼上下文牽涉過多,不適合貼出來,下面是使用我自己整理的使用反射進行動態調用,常用的一些代碼片段:

                 Main(              Type type =  
             
              objNull = type.InvokeMember(, BindingFlags.CreateInstance, , ,  
             
              frankJob = type.InvokeMember(, BindingFlags.CreateInstance, , ,  [] { ,  
             
              fileName = type.InvokeMember(, BindingFlags.GetProperty, , frankJob,  
             
             type.InvokeMember(, BindingFlags.SetProperty, , frankJob,  [] {  
             
              objStr = type.InvokeMember(, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static, , frankJob,  
             
              email = type.InvokeMember(, BindingFlags.InvokeMethod, , frankJob,  [] {   
                          Id { ;                FirstName { ;                LastName { ;                Address { ;                Email { ;  
                           Employee( firstName,                   FirstName =                 LastName =  
                                  .Format(  
               GetEmail(                   .Format(       }

 

參考資料&進一步閱讀

.NET Framework 中的反射

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved