通過反射動態建立物件 方法

2022-01-16 01:32:48 字數 3235 閱讀 3356

之前做的都是獲取特性物件,都是查元資料的資訊,現在我們可以通過反射開始動態的去建立物件和方法

1.兩種呼叫無參建構函式的方法:

建立乙個democlass,裡面有無參建構函式和有參建構函式

public

class

democlass

public

int age

public

democlass()

public democlass(string name,int

age)

}

(1)通過assembly無參建構函式建立物件

assembly assembly=assembly.getexecutingassembly();

object o =assembly.createinstance("

使用建構函式建立物件.democlass

");

createinstance方法的第乙個引數代表了要建立的型別例項的字串名稱(命名空間+類名)。注意到createinstance方法返回的是乙個object物件,如果使用還要強制轉換一下。
(2)通過用activator建立物件
object o2 = activator.createinstance(null, "

使用建構函式建立物件.democlass

");

其中createinstance的第乙個引數是程式集的名稱,為null時表示當前程式集;第二個引數是要建立的型別名稱。activator.createinstance返回的是乙個objecthandle物件,必須執行一次unwrap()才能返回object型別,進而可以強制轉換成其實際型別。objecthandle包含在system.runtime.remoting命名空間中,可見它是remoting相關的,實際上objecthandle類只是乙個對原型別進行了乙個包裝以便進行封送

執行結果如下:

3.呼叫帶參建構函式建立物件

使用assembly的createinstance函式進行物件的建立

public

class

program

}

bindingflags.default不使用任何型別搜尋策略。執行結果:

4.動態呼叫方法

在上面的democlass中新增兩個方法

public

int add(int x, int

y)

public

static

void add(double x, double

y)

(1)type.invokemember呼叫例項方法

public

class

program

;object result=t.invokemember("

add", bindingflags.invokemethod, null

, demo, parameters);

console.writeline(

"呼叫例項方法返回的結果:

"+result);

console.readkey();}}

第乙個引數是指要呼叫的方法名,第二個引數是要呼叫方法,第三個bingder幾乎永遠傳null,第四個是指要在哪個例項上操作,咱們新建的物件demo,最後乙個引數是方法的傳入引數。invokemember方法被呼叫後返回執行結果。

(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

class

program

;democlass demo = new

democlass();

methodinfo info = t.getmethod("

add", bindingflags.instance |bindingflags.public);

info.invoke(demo, parameters);

console.readkey();}}

因為方法中存在多個「add」方法,所以在getmethod中加bindingflags中是必要的,invoke方法第乙個引數是要在那個例項上呼叫該方法,第二個引數時引數列表。invoke返回方法執行結果。

(2)呼叫靜態方法

public

class

program

;methodinfo info = t.getmethod("

add", bindingflags.static |bindingflags.public);

info.invoke(

null

, parameters);

console.readkey();}}

呼叫靜態方法與例項方法的區別在於在用bingdingflags進行搜尋時要指定搜尋static,另外invoke的時候不需要再傳入型別的例項了。

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 方法建立。例子 建立乙個物件...