C 五十六 反射

2021-09-13 17:35:46 字數 4584 閱讀 1781

概念

反射:通過動態獲取程式集,並獲取其中的型別元資料,然後訪問該型別的過程。

在.net中,反射可以實現從物件的外部來了解物件或程式集內部結構的功能,哪怕不知道這個物件或程式集是什麼。

反射可以動態建立出物件並執行其中的方法。

反射是.net中的重要機制,通過反射,可以在執行時獲得程式或程式集中每乙個型別(包括類、結構、委託、介面、列舉等)的成員和成員的資訊。

有了反射,即可對每乙個型別瞭如指掌。還可以直接建立物件,即使這個物件的型別在編譯時還不知道。

新建類庫 

解決方案--->新增--->新建專案--->類庫(.net framework) 

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace classlibrary1

public void method()}}

使用類庫(不使用反射機制)

using classlibrary1;

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace testcsharp

}}--->

建構函式

我的方法

使用反射

新增命名空間:using system.reflection;

訪問類庫

using system;

using system.collections.generic;

using system.linq;

using system.reflection;

using system.text;

using system.threading.tasks;

namespace testcsharp

console.readkey();}}

}--->

classlibrary1.dll

using system;

using system.collections.generic;

using system.linq;

using system.reflection;

using system.text;

using system.threading.tasks;

namespace testcsharp

console.readkey();}}

}--->

classlibrary1.dll

獲得型別

using system;

using system.collections.generic;

using system.linq;

using system.reflection;

using system.text;

using system.threading.tasks;

namespace testcsharp

type mtype = assembly.gettype("classlibrary1.class1");

console.writeline(mtype.name);

console.readkey();}}

}--->

class1

class1

system.type類對於反射起著核心的作用。但它是乙個抽象的基類,type有與每種資料型別對應的派生類,使用不同派生類的物件的方法、字段、屬性等可以來查詢有關該型別的所有資訊。

獲取乙個給定型別的type的三種方式:

type t = typeof(string);

console.writeline(t);

--->

system.string

string s = "aaa";

type t = s.gettype();

console.writeline(t);

--->

system.string

type t = type.gettype("system.string");

console.writeline(t);

建立例項

using system;

using system.collections.generic;

using system.linq;

using system.reflection;

using system.text;

using system.threading.tasks;

namespace testcsharp

}}--->

建構函式

classlibrary1.class1

獲取方法並呼叫

using system;

using system.collections.generic;

using system.linq;

using system.reflection;

using system.text;

using system.threading.tasks;

namespace testcsharp

console.writeline("---------------------------------");

methodinfo method = mtype.getmethod("method");

method.invoke(obj, null);

console.readkey();}}

}--->

建構函式

void method()

system.string tostring()

boolean equals(system.object)

int32 gethashcode()

system.type gettype()

---------------------------------

我的方法

使用介面完成方法呼叫

新建類庫並建立乙個介面

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace classlibrary2

}

新增引用

實現繼承

using classlibrary2;

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

namespace classlibrary1

public void method()}}

將下面檔案複製替換testcsharp資料夾中debug資料夾的同名檔案

完成呼叫

using classlibrary2;

using system;

using system.collections.generic;

using system.linq;

using system.reflection;

using system.text;

using system.threading.tasks;

namespace testcsharp

}}--->

建構函式

classlibrary1.class1

我的方法

第五十六象 己未

讖 曰者非鳥 潛者非魚 戰不在兵 造化遊戲 頌 曰海疆萬里盡雲煙 上迄雲霄下及泉 金母木公工幻弄 干戈未接禍連天 金聖嘆註解 此象軍用火,即亂不在兵之意。頌云,海疆萬里,則戰爭之烈,不僅在於中國也。推背 解圖兩個人對面而立,成對峙之態,手上都拿著 卻不使用,而是口中噴火,天上有兩隻鳥在飛,也呈對峙狀...

愛情五十六課,誰更嫉妒

小的時候,當媽媽去讚美別的孩子時,我們就已經學會了嫉妒。當我們愈是渴求乙個人的愛,愈是害怕失去這份愛時,嫉妒就愈發厲害。在長大的過程中,這種情緒的物件會遷移,從媽媽身上轉移到老師身上,或者同事 領導 密友 愛人身上,當他們顯示出對另乙個人更 偏愛 的姿態時,我們的尾巴就被踩得生疼,便要用嫉妒來表達自...

我的架構夢 (五十六) MongoDB架構

mongodb與mysql中的架構相差不多,底層都使用了可插拔的儲存引擎以滿足使用者的不同需要。用 戶可以根據程式的資料特徵選擇不同的儲存引擎,在最新版本的mongodb中使用了wiredtiger作為默 認的儲存引擎,wiredtiger提供了不同粒度的併發控制和壓縮機制,能夠為不同種類的應用提供...