c#反射的入門學習首先要明白c#反射提供了封裝程式集、模組和型別的物件等等。那麼這樣可以使用反射動態建立型別的例項,將型別繫結到現有物件,或從現有物件獲取型別並呼叫其方法或訪問其字段和屬性。如果**中使用了屬性,可以利用反射對它們進行訪問。
乙個最簡單的c#反射例項,首先編寫類庫如下:
using system;
using system.collections.generic;
using system.text;
namespace reflectiontest
//static method with only one parametor
public static void staticwritestring(string s)
//static method with no parametor
public static void noneparawritestring() }
} 使用命令列編譯csc /t:library reflecttest.cs命令進行編譯,生成reflecttest.dll庫檔案。
然後進行下列程式的編寫:
using system;
using system.collections.generic;
using system.text;
using system.reflection;
namespace reflectiontest;
// 建立程式集ass中的type.fullname類的乙個物件
obj = ass.createinstance(type.fullname);
// 方法method, 物件obj,引數parametors
method.invoke(obj, parametors);
//parametors of indicated method
parametors);//runtimeerror: class reference is wrong
method = type.getmethod("staticwritestring");
//the first parametor will be ignored
method.invoke(null, new string );
method.invoke(obj, new string );
//indicates the instance will equals above line
method.invoke(any, new string );
method = type.getmethod("noneparawritestring");
//sine the method noneparawritestring()
has no parametors so do not indicate any parametors
method.invoke(null, null);
console.readline();
} }}c#反射學習時幾點注意內容:
1.指定類庫檔案必須使用絕對路徑,不能使用相對路徑(其實感覺有點不合理,不太方便)
2.19行,命名空間和類的名字必須一起指定
3.在例子1種必須例項化反射要反射的類,因為要使用的方法並不是靜態方法。
4.由於這個方法有兩個引數,可以用這種object的方法指定引數也可以直接寫method.invoke(obj, new object );
5.在例子2種我們想用的方法是乙個靜態方法,這時候invoke的時候,對於第乙個引數是無視的,也就是我們寫什麼都不會被呼叫,即使我們隨便new了乙個any這樣的object,當然這種寫法是不推薦的。但是對應在例子1種我們如果invoke的時候用了型別不一致的例項來做為引數的話,將會導致乙個執行時的錯誤。
6.第三個例子是乙個呼叫無引數靜態方法的例子,這時候兩個引數我們都不需要指定,用null就可以了。
output:
writestring:test1
staticwritestring:test
staticwritestring:test
staticwritestring:test
noparawritestring
再說乙個問題,如果呼叫的類是靜態類的時候,需要注意乙個問題,肯定我們會想到乙個問題,靜態類是不能例項化的,這時候,31行的類的例項化的方法我們就不需要了,直接使用invoke就可以實現,否則將會出現執行時的錯誤,同樣的道理,第乙個引數將會被無視,只要我們傳對了引數就可以了。
反射實現步驟總結:
1:通過動態鏈結庫的具體位置獲取程式集
2:通過程式集assembly獲取需要的類的型別type type(程式集中可能含有多個類)
system.type type = ass.gettype("reflectiontest.writetest");// 引數是該類在程式集中的完整位置(命名空間 類名)
3:通過type來獲取類的函式(函式的屬性)
methodinfo method = type.getmethod("writestring"); //引數是方法名
4:通過程式集物件初始化程式集中乙個類的例項
object obj = ass.createinstance(type.fullname); // 引數是該類在程式集中的位置(命名空間 類名)
5:建立函式執行需要的引數陣列
// 建立兩個引數的陣列
string test = "test";
int i = 1;
object parametors = new object ;
6:執行該函式
method.invoke(obj,parametors);
方法二:
string strfilename = "d:\\1.rar"; //根據實際情況設定
string strurl = "http://localhost/mjgps/images/caricon.rar"; //根據實際情況設定 中國電子排程系統\sqlpersonal\sqlpersonal\books
// 引數為程式集名稱
assembly assembly = assembly.load("filetransmit");
// 建立filetransmitnamespace.filetransmitclass的物件
// filetransmitnamespace命名空間
// filetransmitclass命名空間裡的類
filetransmitnamespace.filetransmitclass transmit = (filetransmitnamespace.filetransmitclass)assembly.createinstance("filetransmitnamespace.filetransmitclass");
// 呼叫物件的方法
transmit.downloadfile(strurl, strfilename);
C 反射例項
1 建立用於反射使用的dll 新建乙個c 類庫專案,拷貝源 如下,編譯生成dll 假如dll的檔名是testreflect.dll using system using system.collections.generic using system.text namespace webtest pu...
C 反射例項
c 反射的入門學習首先要明白c 反射提供了封裝程式集 模組和型別的物件等等。那麼這樣可以使用反射動態建立型別的例項,將型別繫結到現有物件,或從現有物件獲取型別並呼叫其方法或訪問其字段和屬性。如果 中使用了屬性,可以利用反射對它們進行訪問。msdn描述 反射通常具有以下用途 使用 assembly 定...
C 反射例項講解
1 建立用於反射使用的dll 新建乙個c 類庫專案,拷貝源 如下,編譯生成dll 假如dll的檔名是testreflect.dll 1using system 23namespace webtest412 13 public string writestring string s 14 1718 1...