隨筆-9  評論-168  文章-266  trackbacks-0
          //*********創建實例***********
          Type t = typeof(ClassTest);//表示類型聲明:類類型、接口類型、數組類型、值類型、枚舉類型、類型參數...。
          object obj = Activator.CreateInstance(t);//通過反射創建對象實例,如果是靜態類則不須實例化
          //obj = ass.CreateInstance("ReflectionTest.ClassTest"); //類的全限定名.命名空間.類名
          //*********創建和調用方法***********
          MethodInfo method = t.GetMethod("WriteString"); //搜索具有指定名稱的公共方法。
          String s = (String)method.Invoke(obj, new Object[] { "123" });//反射類的對象實例,方法參數 
          //靜態方法         
          method = type.GetMethod("StaticWriteString");
          method.Invoke(nullnew string[] { "test" }); //如果是靜態方法,第1個參數則忽略,設為null  
           
          //無參的靜態方法
          method = type.GetMethod("NoneParaWriteString");  
          method.Invoke(nullnull);//無參則第2個參數設為null.
           
          System.Diagnostics.Trace.WriteLine(s);//輸出到"調試--窗口--即時窗口"
           
          C#反射學習時幾點注意內容:
          1.指定類庫文件必須使用絕對路徑,不能使用相對路徑(其實感覺有點不合理,不太方便)
          3.第5行如果反射的類使用的是靜態方法,則第1個參數須調為null。
          4.由于這個方法有兩個參數,可以用這種Object的方法指定參數也可以直接寫method.Invoke(obj, new Object[] { "test", 1 });
          5.調用的方法是一個靜態方法,這時候Invoke的時候,對于第一個參數是無視的,也就是我們寫什么都不會被調用,即使我們隨便new了一個any這樣的Object,當然這種寫法是不推薦的。但是對應在例子1種我們如果Invoke的時候用了類型不一致的實例來做為參數的話,將會導致一個運行時的錯誤。
          6.第三個例子是一個調用無參數靜態方法的例子,這時候兩個參數我們都不需要指定,用null就可以了。
          再說一個問題,如果調用的類是靜態類的時候,需要注意一個問題,肯定我們會想到一個問題,靜態類是不能實例化的,這時候,31行的類的實例化的方法我們就不需要了,直接使用Invoke就可以實現,否則將會出現運行時的錯誤,同樣的道理,第一個參數將會被無視,只要我們傳對了參數就可以了。
          posted on 2013-09-25 15:40 紫蝶∏飛揚↗ 閱讀(633) 評論(0)  編輯  收藏 所屬分類: C#

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 孟津县| 万盛区| 鄯善县| 虎林市| 绥芬河市| 玛纳斯县| 亳州市| 耒阳市| 鹿泉市| 舒兰市| 安阳县| 威远县| 台江县| 高清| 鄂托克旗| 元阳县| 岫岩| 沙湾县| 东城区| 阿克陶县| 正镶白旗| 闻喜县| 甘洛县| 兴宁市| 安远县| 离岛区| 纳雍县| 丰县| 皋兰县| 淮安市| 温泉县| 长汀县| 赤水市| 本溪市| 湘乡市| 宕昌县| 大化| 漯河市| 泸定县| 历史| 临西县|