C#反射如何使用

這篇文章主要講解了“C#反射如何使用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C#反射如何使用”吧!

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的鄄城網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

explicit 和 implicit 的含義?

explicit 和 implicit 屬于轉(zhuǎn)換運(yùn)算符,如用這兩者可以讓我們自定義的類型支持相互交換,explicti 表示顯式轉(zhuǎn)換,如從 A -> B 必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換(B = (B)A),implicit 表示隱式轉(zhuǎn)換,如從 B -> A 只需直接賦值(A = B)

隱式轉(zhuǎn)換可以讓我們的代碼看上去更漂亮、更簡潔易懂,所以***多使用 implicit 運(yùn)算符。不過!如果對象本身在轉(zhuǎn)換時(shí)會(huì)損失一些params 有什么用?

params 關(guān)鍵字在方法成員的參數(shù)列表中使用,為該方法提供了參數(shù)個(gè)數(shù)可變的能力,它在只能出現(xiàn)一次并且不能在其后再有參數(shù)定義,之前可以

示例:

using System;  using System.Collections.Generic;  using System.Text;   namespace ConsoleApplication1 {   class App {   //***個(gè)參數(shù)必須是整型,但后面的參數(shù)個(gè)數(shù)是可變的。   //而且由于定的是object數(shù)組,所有的數(shù)據(jù)類型都可以做為參數(shù)傳入  public static void UseParams(int id, params object[] list){   Console.WriteLine(id);for (int i = 0; i < list.Length; i++){   Console.WriteLine(list[i]);  }   static void Main(){   //可變參數(shù)部分傳入了三個(gè)參數(shù),都是字符串類型UseParams(1, "a", "b", "c");  //可變參數(shù)部分傳入了四個(gè)參數(shù),分別為字符串、整數(shù)、浮點(diǎn)數(shù)和雙精度浮點(diǎn)數(shù)數(shù)組  UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });   Console.ReadLine();  }

什么是反射?

反射,Reflection,通過它我們可以在運(yùn)行時(shí)獲得各種信息,如程序集、模塊、類型、字段、屬性、方法和事件,通過對類型動(dòng)態(tài)實(shí)例化后,還可以對其執(zhí)行操作

一般用于插件式框架程序和設(shè)計(jì)模式的實(shí)現(xiàn),當(dāng)然反射是一種手段可以充分發(fā)揮其能量來完成你想做的任何事情(前面好象見過一位高人用反射調(diào)用一個(gè)官方類庫中未說明的函數(shù)……)

示例:

  1. using System;  

  2. using System.Collections.Generic;  

  3. using System.Text;  

  4.  

  5. namespace Example25Lib {   

  6. public class Class1 {   

  7. private string name;private int age;  

  8.  

  9. //如果顯式的聲明了無參數(shù)構(gòu)造函數(shù),客戶端只需要用程序集的CreateInstance即可實(shí)例化該類  

  10. //在此特意不實(shí)現(xiàn),以便在客戶調(diào)用端體現(xiàn)構(gòu)造函數(shù)的反射實(shí)現(xiàn)//public Class1()  

  11.  

  12. }   

  13. public Class1(string Name, int Age)  

  14. { name = Name;age = Age;} public void ChangeName(string NewName)  

  15. { name = NewName;} public void ChangeAge(int NewAge)  

  16. { age = NewAge;} public override string ToString()  

  17. { return string.Format("Name: {0}, Age: {1}", name, age);  

  18. }  

  19.  

  20. using System;  

  21. using System.Collections.Generic;  

  22. using System.Text;  

  23.  

  24. //注意添加該反射的命名空間using System.Reflection;  

  25. namespace Example25 { class Program { static void Main(string[] args)  

  26. { //加載程序集Assembly tmpAss = Assembly.LoadFile
    (AppDomain.CurrentDomain.BaseDirectory + "Example25Lib.dll");  

  27. //遍歷程序集內(nèi)所有的類型,并實(shí)例化Type[] tmpTypes = tmpAss.GetTypes();  

  28. foreach (Type tmpType in tmpTypes)  

  29. { //獲取***個(gè)類型的構(gòu)造函數(shù)信息ConstructorInfo[] 
    tmpConsInfos = tmpType.GetConstructors();  

  30. foreach (ConstructorInfo tmpConsInfo in tmpConsInfos)  

  31. { //為構(gòu)造函數(shù)生成調(diào)用的參數(shù)集合ParameterInfo[] 
    tmpParamInfos = tmpConsInfo.GetParameters();  

  32. object[] tmpParams = new object[tmpParamInfos.Length];

  33. for (int i = 0; i < tmpParamInfos.Length; i++)  

  34. { tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);  

  35. if (tmpParamInfos[i].ParameterType.FullName == "System.String")  

  36. { tmpParams[i] = "Clark";}  

  37. //實(shí)例化對象object tmpObj = tmpConsInfo.Invoke(tmpParams);Console.WriteLine(tmpObj);  

  38. //獲取所有方法并執(zhí)行foreach (MethodInfo tmpMethod in tmpType.GetMethods())  

  39. { //為方法的調(diào)用創(chuàng)建參數(shù)集合tmpParamInfos = tmpMethod.GetParameters();  

  40. tmpParams = new object[tmpParamInfos.Length];

  41. for (int i = 0; i < tmpParamInfos.Length; i++)  

  42. { tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);  

  43. if (tmpParamInfos[i].ParameterType.FullName == "System.String")  

  44. { tmpParams[i] = "Clark Zheng";

  45. } if (tmpParamInfos[i].ParameterType.FullName == "System.Int32")  

  46. { tmpParams[i] = 27;} tmpMethod.Invoke(tmpObj, tmpParams);}  

  47. //調(diào)用完方法后再次打印對象,比較結(jié)果Console.WriteLine(tmpObj);}  

  48. Console.ReadLine();} 

感謝各位的閱讀,以上就是“C#反射如何使用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C#反射如何使用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

名稱欄目:C#反射如何使用
網(wǎng)頁鏈接:http://muchs.cn/article36/gphipg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站營銷、品牌網(wǎng)站制作、電子商務(wù)、手機(jī)網(wǎng)站建設(shè)、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)