程式集包含模組,而模組包含型別,型別又包含成員。反射則提供了封裝程式集、模組和型別的物件。您可以使用反射動態地建立型別的例項,將型別繫結到現有物件,或從現有物件中獲取型別。然後,可以呼叫型別的方法或訪問其字段和屬性。反射通常具有以下用途:
使用 assembly 定義和引導程式集,載入在程式集清單中列出的模組,以及從此程式集中查詢型別並建立該型別的例項。
使用 module 了解如下的類似資訊:包含模組的程式集以及模組中的類等。您還可以獲取在模組上定義的所有全域性方法或其他特定的非全域性方法。
使用 constructorinfo 了解以下資訊:建構函式的名稱、引數、訪問修飾符(如 public 或 private)和實現詳細資訊(如 abstract 或 virtual)等。使用 type 的 getconstructors 或 getconstructor 方法來呼叫特定的建構函式。
使用 methodinfo 了解以下資訊:方法的名稱、返回型別、引數、訪問修飾符(如 public 或 private)和實現詳細資訊(如 abstract 或 virtual)等。使用 type 的 getmethods 或 getmethod 方法來呼叫特定的方法。
使用 fieldinfo 了解以下資訊:欄位的名稱、訪問修飾符(如 public 或 private)和實現詳細資訊(如 static)等;並獲取或設定字段值。
使用 eventinfo 來了解如下的類似資訊:事件的名稱、事件處理程式資料型別、自定義屬性、宣告型別和反射型別等;並新增或移除事件處理程式。
使用 propertyinfo 來了解如下的類似資訊:屬性的名稱、資料型別、宣告型別、反射型別和唯讀或可寫狀態等;並獲取或設定屬性值。
使用 parameterinfo 來了解如下的類似資訊:引數的名稱、資料型別、引數是輸入引數還是輸出引數,以及引數在方法簽名中的位置等。
當您在乙個應用程式域的僅反射上下文中工作時,請使用 customattributedata 來了解有關自定義屬性的資訊。使用 customattributedata,您不必建立屬性的例項就可以檢查它們。[from:msdn]
通過乙個示例來簡要說明:
using system;
using system.reflection;
namespace testreflection
;//建立例項
//object testname = assembly.getassembly(mytype).createinstance("person");
object aperson = activator.createinstance (mytype, constuctparms);
//使用methodinfo 和invoke 呼叫方法
methodinfo displayinfomethod = mytype.getmethod ("displayinfo");
displayinfomethod .invoke(aperson, new object );
//使用invokemember 呼叫方法
//呼叫方法的一些標誌位
bindingflags flag = bindingflags .invokemethod | bindingflags.public | bindingflags.instance;
mytype.invokemember("displayinfo", flag, null, aperson, new object );
//如果方法有返回值
string name = (string)mytype.invokemember("getname" , flag, null , aperson, null );
system.console.writeline( "call getname(), return: " + name );
//設定屬性值
mytype.invokemember("age" , bindingflags.setproperty, null, aperson, new object );
//得到屬性值
int age = (int)mytype.invokemember( "age", bindingflags.getproperty, null, aperson, null);
system.console .writeline("get the property of age : " + convert.tostring(age));
//設定字段值
mytype.invokemember ("name", bindingflags.setfield , null, aperson , new object );
//獲取字段值
string fname = ( string)mytype.invokemember("name", bindingflags.getfield, null , aperson, null );
system.console.writeline("get the field value of name : " + fname);
mytype.invokemember("displayname", flag, null, aperson, null);
//獲得方法集
methodinfo methods = mytype.getmethods();
foreach (methodinfo m in methods)
//同樣還有:getfiedls()、getproperties()、getevents()等方法
system.console.readline();
}}
public class person
set}
public person (string name)
public void displayinfo(string info)
public void displayname()
public string getname()}}
說明:使用反射動態呼叫類成員,需要type類的乙個方法:invokemember。對該方法的宣告如下:
public object invokemember(
string name,
bindingflags invokeattr,
binder binder,
object target,
object args
);引數
name
string,它包含要呼叫的建構函式、方法、屬性或字段成員的名稱。
- 或 -
空字串 (""),表示呼叫預設成員。
invokeattr
乙個位遮蔽,由乙個或多個指定搜尋執行方式的 bindingflags 組成。訪問可以是 bindingflags 之一,如 public、nonpublic、private、invokemethod 和 getfield 等。不需要指定查詢型別。如果省略查詢型別,則將應用 bindingflags.public | bindingflags.instance。
binder
乙個 binder 物件,該物件定義一組屬性並啟用繫結,而繫結可能涉及選擇過載方法、強制引數型別和通過反射呼叫成員。
- 或 -
若為空引用(visual basic 中為 nothing),則使用 defaultbinder。
target
在其上呼叫指定成員的 object。
args
包含傳遞給要呼叫的成員的引數的陣列。
返回值表示被呼叫成員的返回值的 object。
下列 bindingflags 篩選標誌可用於定義包含在搜尋中的成員:
為了獲取返回值,必須指定 bindingflags.instance 或 bindingflags.static。
指定 bindingflags.public 可在搜尋中包含公共成員。
指定 bindingflags.nonpublic 可在搜尋中包含非公共成員(即私有成員和受保護的成員)。
指定 bindingflags.flattenhierarchy 可包含層次結構上的靜態成員。
下列 bindingflags 修飾符標誌可用於更改搜尋的執行方式:
bindingflags.ignorecase,表示忽略 name 的大小寫。
bindingflags.declaredonly,僅搜尋 type 上宣告的成員,而不搜尋被簡單繼承的成員。
可以使用下列 bindingflags 呼叫標誌表示要對成員採取的操作:
createinstance,表示呼叫建構函式。忽略 name。對其他呼叫標誌無效。
invokemethod,表示呼叫方法,而不呼叫建構函式或型別初始值設定項。
對 setfield 或 setproperty 無效。
getfield,表示獲取字段值。對 setfield 無效。
setfield,表示設定字段值。對 getfield 無效。
getproperty,表示獲取屬性。對 setproperty 無效。
setproperty 表示設定屬性。對 getproperty 無效。
c 反射用法例子
using system using system.collections.generic using system.text using system.reflection namespace refdemo 通過呼叫帶參的建構函式來得到物件 constructorinfo ci type.get...
c 反射 簡單小例子
介面using system usingsystem.text namespacejiang.iform voidrun 以下是實現介面的類 using system using system.drawing using system.text using system.windows.forms ...
Java反射例子
一 學生類 package com.enorth.bean title 學生 description 學生元件 company 秦金雷 version 1.0 public class student public void setstudentid int studentid public str...