程式集載入和反射

2022-01-16 16:47:40 字數 3010 閱讀 3483

最近一直都在看關於程式集載入和反射方面的資料, 所以在這裡把我所學習到的東西記錄下來,方便自己以後複習,也給園子裡面不懂的朋友參考。

.net中反射在執行中過程中解析程式集中的元資料,獲得型別中的成員(包括字段、構造器、方法、屬性、事件等)資訊。

把下面的類放在乙個類庫工程中,並編譯生成程式集(例如為classlibrary1.dll,假設把dll放在d盤根目錄下面)

view code

1

public

class

reflecttestclass28

set 9}

1011

public

intage

1214

set 15}

1617

///18

///no paramter constructor

19///

20public

reflecttestclass()

2123

24///

25///

constructor with parameter

26///

27///

28///

29public reflecttestclass(string names,int

ages)

3034

35public

string writestring(string

name)

3639

40public

static

string writename(string

name)

4144

45public

string

wirtenopara()

4649 }

然後建立乙個控制台程式用來動態載入上面生成的程式集和輸出型別中的成員,**中有詳細的介紹。

class

program

//用命名空間+類名獲取型別

typea = ass.gettype("

classlibrary1.reflecttestclass");

//獲得方法名稱

methodinfo method = typea.getmethod("

writestring");

//建立例項

obj = ass.createinstance("

classlibrary1.reflecttestclass");

string result = (string)method.invoke(obj,new

string );

console.writeline(

"invoke method with parameter");

console.writeline(

"-----------------------");

console.writeline(result);

console.writeline(

"-----------------------");

console.writeline();

method = typea.getmethod("

writename");

result = (string)method.invoke(null,new

string );

console.writeline(

"invoke static method with parameter");

console.writeline(

"-----------------------");

console.writeline(result);

console.writeline(

"-----------------------");

console.writeline();

method = typea.getmethod("

wirtenopara");

console.writeline(

"invoke method with noparameter");

result = (string)method.invoke(obj, null

); console.writeline(

"-----------------------");

console.writeline(result);

console.writeline(

"-----------------------");

}catch

(filenotfoundexception ex)

console.readline();

}//////

顯示陣列資訊

/// ///

///public

static

void showmessage(t array)

console.writeline(

"-----------------------");

console.writeline();}}

篩選返回的成員種類

可以呼叫type的getmembers,getfields,getmethods,getproperties或者getevenents方法來查詢乙個型別的成員。在呼叫上面的任何乙個方法時,都可以傳遞system.reflection.bindingflags列舉型別的乙個例項,使用這個列舉型別目的是對這些方法返回的成員進行篩選。對於這個列舉型別中成員的資訊可以參考msdn:

注意:在返回乙個成員集合的所有方法中, 都有乙個不獲取任何實參的過載版本。如果不傳遞bindingflags實參,所有這些方法都返回公共成員,預設設定為bindingflags.public|bindingflags.instance|bindingflags.static. (如果指定public或nonpublic,那麼必須同時指定instance,否則不返回成員)。

程式集載入和反射

元資料表是用一系列字段表,方法表,型別定義表組成的。可以利用system.reflection命名空間中包含的型別,可以寫 來反射這些元資料表。具體的反射機制我是這樣理解的 首先應該清楚的了解到,system.reflection命名空間中的型別為程式集或模組中包含的換資料表提供了乙個物件模型 通過...

談談 程式集載入和反射

最近一直都在看關於程式集載入和反射方面的資料,所以在這裡把我所學習到的東西記錄下來,方便自己以後複習,也給園子裡面不懂的朋友參考。net中反射在執行中過程中解析程式集中的元資料,獲得型別中的成員 包括字段 構造器 方法 屬性 事件等 資訊。把下面的類放在乙個類庫工程中,並編譯生成程式集 例如為cla...

談談 程式集載入和反射

最近一直都在看關於程式集載入和反射方面的資料,所以在這裡把我所學習到的東西記錄下來,方便自己以後複習,也給園子裡面不懂的朋友參考。net中反射在執行中過程中解析程式集中的元資料,獲得型別中的成員 包括字段 構造器 方法 屬性 事件等 資訊。把下面的類放在乙個類庫工程中,並編譯生成程式集 例如為cla...