在.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 物件所表示的類的乙個新例項。如同用乙個...