通過反射動態例項化物件中出現的乙個奇怪問題

2021-09-08 15:16:04 字數 1549 閱讀 1085

在.net中通過反射,可以對程式集進行很多操作。現在我希望通過動態引導程式集,並將該程式集中的乙個類物件進行例項化。然後將獲得這個object物件通過強制轉換,轉換為具體的類物件,以達到呼叫其方法的目的。

我要載入的程式集很簡單,只有乙個類,且類裡面只有乙個公有屬性和乙個公共方法。**如下:

system;

namespace

autoobject

public

void

print(

string

s)程式集名為autoobject.dll,路徑假設為」e:\」。命名空間為autoobject,類名為testobject。

然後我編寫乙個控制台應用程式來動態載入它:

system;

using

system.reflection;

namespace

usereflector

public

static

object

createobject(

string

assemblyfile)

主方法是createobject()。

首先通過assembly.loadfrom()載入該程式集,然後通過gettype()方法獲得指定類名的物件型別。此時type的name為autoobject.testobject。

然後通過activator.createinsatance(type),來呼叫建構函式獲得該類物件的例項,返回object型別物件。

然後再main()中,將上述方法建立的物件強制轉換為autoobject.testobject型別。當然,我在控制台程式中又手工新增了對autoobject.dll的引用。最後呼叫轉換後的物件test的print()方法。

執行,結果丟擲異常「指定的轉換無效。」

我用斷點除錯,在執行createobject()方法的最後一句:return obj時,得到obj的資訊是:

obj的值是,型別為system.object。同時還看到類物件的屬性name,其值為「wayfarer「,型別為string。顯然它是和testobject類物件符合的啊,為什麼不能轉換呢?

我在main()中引入了另乙個例項:

object obj2 = new autoobject.testobject();

再將前面建立好的obj賦給obj2,再對obj2進行如前的轉換:

autoobject.testobject test = (autoobject.testobject)obj2;

結果報告的錯誤是一樣的。但我經過斷點除錯,發現obj和obj2兩個物件的除錯資訊都和上面一樣,可為什麼結果同樣是錯誤的呢?

但如果我把前面獲得的type改為直接從類物件獲得,執行就正常了。

原來的:type type = assembly.gettype("autoobject.testobject");

修改後: type type = typeof(autoobject.testobject);

這又是為什麼?事實上兩種方法獲得的type都是autoobject.testobject型別啊?

真實百思不得其解!

C 反射例項化物件

經常用反射來構造物件,好記性不如爛部落格,寫在這裡做一下筆記 反射需要引用system.reflection命名空間 1 無參構造例項 assembly assembly1 assembly.loadfile 程式集路徑,不能是相對路徑 無參建構函式 object objnoparam assemb...

c 通過反射 例項化類

1.用type 在 website 下 userdao userdao userdao type.gettype userdaopath getconstructor system.type.emptytypes invoke null 如果構造方法有引數的話,這樣。定義引數型別陣列 type tp...

Java程式設計 反射( 反射例項化物件)

反射例項化物件 若有了class類物件,則可以做到利用反射來實現物件例項化操作。1 例項化物件方法 public tnewinstance throws instantiationexception,illegalacces ception 建立此 class 物件所表示的類的乙個新例項。如同用乙個...