反射提供了封裝程式集、模組和型別的物件(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);
C 反射實用技術筆記
反射提供了封裝程式集 模組和型別的物件 type 型別 可以使用反射動態建立型別的例項,將型別繫結到現有物件,或從現有物件獲取型別並呼叫其方法或訪問其字段和屬性。如果 中使用了屬性,可以利用反射對它們進行訪問。程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集 模組和型別的物件。...
C 反射實用技術筆記
反射提供了封裝程式集 模組和型別的物件 type 型別 可以使用反射動態建立型別的例項,將型別繫結到現有物件,或從現有物件獲取型別並呼叫其方法或訪問其字段和屬性。如果 中使用了屬性,可以利用反射對它們進行訪問。程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集 模組和型別的物件。...
ExtJs Gridpanel實用技術
行選擇模式 js var rowcount grid.getselectionnode getselections var rowcount grid.getselectionnode getselections 可以獲取全部選中的記錄,得到的rowcount將是乙個array,比如想獲取 列的資料...