C 反射實用技術筆記

2021-09-22 09:41:39 字數 1909 閱讀 6294

反射提供了封裝程式集、模組和型別的物件(type 型別)。可以使用反射動態建立型別的例項,將型別繫結到現有物件,或從現有物件獲取型別並呼叫其方法或訪問其字段和屬性。如果**中使用了屬性,可以利用反射對它們進行訪問。

程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集、模組和型別的物件。您可以使用反射動態地建立型別的例項,將型別繫結到現有物件,或從現有物件中獲取型別。然後,可以呼叫型別的方法或訪問其字段和屬性。反射通常具有以下用途:

system.reflection.emit 命名空間的類提供了一種特殊形式的反射,使您能夠在執行時構造型別。

反射也可用於建立稱作型別瀏覽器的應用程式,它使使用者能夠選擇型別,然後檢視有關選定型別的資訊。

反射還有其他一些用途。jscript 等語言編譯器使用反射來構造符號表。system.runtime.serialization 命名空間中的類使用反射來訪問資料並確定要持久儲存的字段。system.runtime.remoting 命名空間中的類通過序列化來間接地使用反射。

—— msdn 反射(c#

)反射概述

我們可以通過程式集的檔名來載入乙個程式集。

assembly libassembly = assembly.load("lib.entity");

在得到程式集之後,我們可以得到乙個或所有這個程式集下的型別。

如果我們知道乙個類的全稱(包括命名空間),可以通過下面的方法獲取到這個類的型別:

type booktype = libassembly.gettype("

lib.entity.book

");

或者,我們可以得到這個程式集下的所有型別:

type alltypes = libassembly.gettypes();

在得到型別以後,可以根據型別來建立型別的例項:

lib.entity.book book = activator.createinstance(booktype) as lib.entity.book;

其實當我們知道乙個型別以後,動態的建立乙個例項是很不合理的,個人認為這裡可以用來例項化乙個介面或者子類,對於ioc(控制反轉)比較有用。例如:

ibook bk = activator.createinstance(booktype) as lib.entity.book;

在例項化該型別以後,可以通過呼叫該型別的方法:

methodinfo method = booktype.getmethod("

getbookstring

", bindingflags.instance | bindingflags.ignorecase | bindingflags.public | bindingflags.nonpublic);

output(method.invoke(book, null).tostring());

通過getmethod方法,配合後面的繫結標識,不僅可以獲取公共方法,還可以獲取私有和受保護的方法、靜態方法,並呼叫它們。

我們可以通過型別的getproperty方法獲取屬性資訊:

propertyinfo info = booktype.getproperty("

title

");

還可以為該屬性賦值:

info.setvalue(book, value, null);

欄位的訪問與之相似。

這種訪問欄位和屬性的技術常被用作orm中。

這個attribute是對型別、方法或字段的修飾。如果存在,我們可以在執行時獲取到。

booktype.getcustomattributes(false);

該技術和上乙個相配合,常用來實現乙個orm框架。

C 反射實用技術筆記

反射提供了封裝程式集 模組和型別的物件 type 型別 可以使用反射動態建立型別的例項,將型別繫結到現有物件,或從現有物件獲取型別並呼叫其方法或訪問其字段和屬性。如果 中使用了屬性,可以利用反射對它們進行訪問。程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集 模組和型別的物件。...

C 反射實用技術

反射提供了封裝程式集 模組和型別的物件 type 型別 可以使用反射動態建立型別的例項,將型別繫結到現有物件,或從現有物件獲取型別並呼叫其方法或訪問其字段和屬性。如果 中使用了屬性,可以利用反射對它們進行訪問。程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集 模組和型別的物件。...

ExtJs Gridpanel實用技術

行選擇模式 js var rowcount grid.getselectionnode getselections var rowcount grid.getselectionnode getselections 可以獲取全部選中的記錄,得到的rowcount將是乙個array,比如想獲取 列的資料...