C 反射概念以及例項詳解

2021-06-05 18:54:50 字數 3627 閱讀 1889

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...