之前做的都是獲取特性物件,都是查元資料的資訊,現在我們可以通過反射開始動態的去建立物件和方法
1.兩種呼叫無參建構函式的方法:
建立乙個democlass,裡面有無參建構函式和有參建構函式
public(1)通過assembly無參建構函式建立物件class
democlass
public
int age
public
democlass()
public democlass(string name,int
age)
}
assembly assembly=assembly.getexecutingassembly();object o =assembly.createinstance("
使用建構函式建立物件.democlass
");
createinstance方法的第乙個引數代表了要建立的型別例項的字串名稱(命名空間+類名)。注意到createinstance方法返回的是乙個object物件,如果使用還要強制轉換一下。
(2)通過用activator建立物件
object o2 = activator.createinstance(null, "其中createinstance的第乙個引數是程式集的名稱,為null時表示當前程式集;第二個引數是要建立的型別名稱。activator.createinstance返回的是乙個objecthandle物件,必須執行一次unwrap()才能返回object型別,進而可以強制轉換成其實際型別。objecthandle包含在system.runtime.remoting命名空間中,可見它是remoting相關的,實際上objecthandle類只是乙個對原型別進行了乙個包裝以便進行封送使用建構函式建立物件.democlass
");
執行結果如下:
3.呼叫帶參建構函式建立物件
使用assembly的createinstance函式進行物件的建立
publicbindingflags.default不使用任何型別搜尋策略。執行結果:class
program
}
4.動態呼叫方法
在上面的democlass中新增兩個方法
public(1)type.invokemember呼叫例項方法int add(int x, int
y)
public
static
void add(double x, double
y)
public第乙個引數是指要呼叫的方法名,第二個引數是要呼叫方法,第三個bingder幾乎永遠傳null,第四個是指要在哪個例項上操作,咱們新建的物件demo,最後乙個引數是方法的傳入引數。invokemember方法被呼叫後返回執行結果。class
program
;object result=t.invokemember("
add", bindingflags.invokemethod, null
, demo, parameters);
console.writeline(
"呼叫例項方法返回的結果:
"+result);
console.readkey();}}
(2)使用type.invokemember呼叫靜態方法
public呼叫靜態方法時與調例項方法差別在第四個引數上,調靜態方法只需要傳遞型別就可以。class
program
;object result=t.invokemember("
add", bindingflags.invokemethod, null
, t, parameters);
console.readkey();}}
5.使用methodinfo.invoke呼叫方法
先獲取乙個methodinfo例項,然後呼叫該例項的invoke方法
(1)呼叫例項方法
public因為方法中存在多個「add」方法,所以在getmethod中加bindingflags中是必要的,invoke方法第乙個引數是要在那個例項上呼叫該方法,第二個引數時引數列表。invoke返回方法執行結果。class
program
;democlass demo = new
democlass();
methodinfo info = t.getmethod("
add", bindingflags.instance |bindingflags.public);
info.invoke(demo, parameters);
console.readkey();}}
(2)呼叫靜態方法
public呼叫靜態方法與例項方法的區別在於在用bingdingflags進行搜尋時要指定搜尋static,另外invoke的時候不需要再傳入型別的例項了。class
program
;methodinfo info = t.getmethod("
add", bindingflags.static |bindingflags.public);
info.invoke(
null
, parameters);
console.readkey();}}
6.遲繫結
在我們專案中,各個外掛程式實現了同乙個外掛程式介面,再執行時動態的去載入哪個外掛程式,如果不使用反射動態呼叫的情況下,只能去寫多個if else了。編譯器在執行前根本不知道去執行哪個方法,稱為遲繫結。
通過反射動態建立物件執行的方法
public class test09 總結 通過class物件.newinstance 是呼叫的物件的無參構造,要是該物件沒有無參構造,就不能創造物件 通過class物件先去獲取構造方法,再通過構造方法.newinstance 傳入對應的引數 可以走有參構造和無參構造 通過反射獲取的方法可以通過方...
C 反射 動態建立物件
上面部落格學習了使用反射檢視型別的資訊,以及使用反射獲取特性物件。下面使用反射來動態建立物件。首先準備乙個test類 public class testclass public testclass int a,int b public int show public static int show ...
反射 建立物件 呼叫方法
通過反射建立物件的思路 1.首次獲取類的類物件,獲取方式看前一篇部落格。2.呼叫類物件的newinstance 方法建立該類的實體物件。這是呼叫的類的預設構造器。若想呼叫非預設的構造器建立例項物件,需要先通過class物件獲取構造器,在用構造器呼叫newinstance 方法建立。例子 建立乙個物件...