日韩 亚洲一区二_久久vs国产综合色大全_国产精品福利在线_欧美在线一级A片免费观看欧美在线_女同性毛片60分钟

您現(xiàn)在所在的位置:首頁(yè) >學(xué)習(xí)資源 > Unity遊戲/VR/AR入門(mén)教材 > VR開(kāi)發(fā)入門(mén)教程32:反射生成對(duì)象

VR開(kāi)發(fā)入門(mén)教程32:反射生成對(duì)象

來(lái)源:奇酷教育 發(fā)表於:

1 用Type構(gòu )建對(duì)象用構(gòu )造函數(shù)動(dòng)態(tài)生成對(duì)象:既然有反射 那就有正射對(duì)比一下:有一個(gè)class Test 有無(wú)參構(gòu )造方法獲取實(shí)例的比較:正 :由

1.用Type構(gòu )建對(duì)象
用構(gòu )造函數(shù)動(dòng)態(tài)生成對(duì)象:
既然有反射 那就有“正射”
對(duì)比一下:
有一個(gè)class Test  有無(wú)參構(gòu )造方法
獲取實(shí)例的比較:
“正” :由類(lèi)名直接使用關(guān)鍵字new來(lái)獲得 語法:new Test()
反射:未知類(lèi)名 運(yùn)行時(shí)獲得類(lèi)型名:例如:Type type = Type.GetType("Test");
   Object o = type.GetConstructor (new Type[]{}).Invoke (null);
  當(dāng)然參數(shù)也可以由配置文件獲得
以上調(diào)用無(wú)參構(gòu )造 帶參的構(gòu )造怎麼調(diào)用呢?
 
2.用Activator生成對(duì)象:
      Type t = typeof(NewClassw);
       //構(gòu )造函數(shù)的參數(shù)
       object[] obj = new object[2] { "實(shí)參1", "實(shí)參2" };   
       //用Activator的CreateInstance靜態(tài)方法,生成新對(duì)象
       object o = Activator.CreateInstance(t,obj);
3.Assembly生成對(duì)象:
Assembly assembly = Assembly.Load ("ReflectTest");
Object obj = assembly.CreateInstance ("ReflectTest.Wood");

反射獲取欄位

一般用於已知對(duì)象時(shí)使用,同樣用正反來(lái)做對(duì)比,已知對(duì)象MyClass obj,對(duì)象內(nèi)有name這個(gè)欄位。
 
正:
obj.name = "xxx"即可設(shè)置該對(duì)象的值
obj.name即可獲得該對(duì)象的值
 
反射:
//獲取類(lèi)的描述對(duì)象
Type t = obj.GetType();
//取得欄位描述對(duì)象
FieldInfo fi = t.GetField("name");
//獲取或設(shè)置欄位值
fi.SetValue(obj, "k001");
fi.GetValue(obj);
 
一般在C#中以屬性替代欄位
//獲取類(lèi)的描述對(duì)象
Type t = obj.GetType();
//取得屬性描述對(duì)象
PropertyInfo pi1 = t.GetProperty("Name");
//獲取或設(shè)置屬性值
pi1.SetValue(obj, "k001",null);
pi1.GetValue(obj,null);

反射調(diào)用方法

一般用於對(duì)象、方法名、參數(shù)類(lèi)型已知的情況
對(duì)象:obj 
方法名:methodName
參數(shù)類(lèi)型 String int
 
正:
直接給予參數(shù)調(diào)用:obj.methodName("實(shí)參1",實(shí)參2(int))
 
反射:
//獲取類(lèi)的描述對(duì)象
Type t = obj.GetType();
//取得方法描述對(duì)象
MethodInfo mi = t.GetMethod("show");
//調(diào)用方法
mi.Invoke(obj, "實(shí)參1",實(shí)參2(int));
參數(shù)可以換(huàn)成數(shù)組

反射載入程序集

System.Reflection.Assembly類(lèi)
    Assembly類(lèi)可以獲得程序集的信息,也可以動(dòng)態(tài)的加載程序集,以及在程序集中查找類(lèi)型信息,並創(chuàng)建該類(lèi)型的實(shí)例。
   使用Assembly類(lèi)可以降低程序集之間的耦合,有利於軟體結(jié)構(gòu )的合理化。
   
   通過(guò)程序集名稱(chēng)返回Assembly對(duì)象
       Assembly ass = Assembly.Load("ClassLibrary831");
   通過(guò)DLL文件名稱(chēng)返回Assembly對(duì)象
       Assembly ass = Assembly.LoadFrom("ClassLibrary831.dll");
   通過(guò)Assembly獲取程序集中類(lèi)
       Type t = ass.GetType("ClassLibrary831.NewClass");   //參數(shù)必須是類(lèi)的全名
   通過(guò)Assembly獲取程序集中所有的類(lèi)
       Type[] t = ass.GetTypes();
      
   //通過(guò)程序集的名稱(chēng)反射
   Assembly ass = Assembly.Load("ClassLibrary831");
   Type t = ass.GetType("ClassLibrary831.NewClass");
   object o = Activator.CreateInstance(t, "", "");
   MethodInfo mi = t.GetMethod("show");
   mi.Invoke(o, null);
  //通過(guò)DLL文件全名反射其中的所有類(lèi)型
   Assembly assembly = Assembly.LoadFrom("xxx.dll的路徑");
   Type[] aa = a.GetTypes();
   foreach(Type t in aa)
   {
       if(t.FullName == "a.b.c")
       {
           object o = Activator.CreateInstance(t);
       }
   }