C 基礎 反射

2021-09-23 13:31:17 字數 1674 閱讀 3774

反射的實現主要依賴於微軟提供的兩個命名空間:system.reflection 和system.type 兩個命名空間:

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

可以在執行時 建立 訪問 呼叫 型別。

反射在實際應用中通常被用於: 深複製實現,資料庫datatable 轉換成執行的型別 等。

情況①:當我們不知道物件的時候(t)我們通常使用下面的方式來獲取某個型別的type

type type=typeof(t);

情況②:當我們已知某個物件的時候 我們可以直接使用gettype(),方法來獲取指定物件型別的type物件

如:person p=new person();

type persontype=p.gettype();

1:獲取類中的所有方法(不包括私有方法)

methodinfo methods=type.getmethods();

2:獲取某個型別的所有屬性(私有屬性也無法獲取到)

propertyinfo propertyinfo=type.getproperties();

3:獲取型別的所有字段(私有欄位也無法獲取到)

fieldinfo fields=type.getfields();

4:獲取所有成員,不包括私有成員

memberinfo memberinfos=type.getmembers();

#通過反射來獲取乙個程式集的型別

1:動態載入 .dll檔案

assembly assembly=assembly.loadfile(@"檔案路徑")

2:獲取剛剛載入的程式集中的所有型別

type type=assembly.gettypes();

3:獲取訪問修飾符為 public的型別

type type =assembly.getexportedtypes();:

4:獲取某個類的type

type type=assembly.gettype("命名空間.類名");

5:根據4中的type獲取某個特定的方法(根據方法名)

methodinfo method=type.getmethod("方法名");

7:呼叫這個方法

method.invoke()

8:通過反射來 建立某個型別的物件(其實就是通過型別的type 來建立該型別的物件)

object obj=activator.createinstance(type);

method.invoke(obj,null)

三:通過反射獲取類的屬性,並賦值

1:獲取name屬性

propertyinfo property=type.getproperty("name");

object obj=activator.createinstance(property);

2:為屬性賦值

property.setvalue(obj,"姓名",null)

3:獲取屬性

string  property=property.getvalue(obj,null).tostring();

四:建構函式

constructorinfo ctor=type.getconstructor(new type)

呼叫建構函式

object obj=ctor.invoke(new object);

C 基礎 反射

反射指程式可以訪問 檢測和修改它本身狀態或行為的一種能力。程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集 模組和型別的物件。您可以使用反射動態地建立型別的例項,將型別繫結到現有物件,或從現有物件中獲取型別。然後,可以呼叫型別的方法或訪問其字段和屬性。優點 1 反射提高了程式的...

C 基礎 反射

記錄一下放射的一些東西把,之前都是學了記在筆記本上,現在整理上來,當作是複習和知新。反射的實現主要依賴於微軟提供的兩個命名空間 system.reflection 和system.type 兩個命名空間 反射 就是動態的獲取程式集,並獲取其中型別的元資料,然後訪問該型別的過程。可以在執行時 建立 訪...

C 基礎語法 反射

參考文獻 乙個執行的程式,檢視本身的元素或其他型別的元資料的行為叫做反射 mvc ioc orm aop 這些都用到反射。class baseclass class derivedclass baseclass static void main string args foreach var v i...