溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#中反射方法的用法

發(fā)布時(shí)間:2021-08-25 17:54:56 來源:億速云 閱讀:114 作者:chen 欄目:編程語言

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

首先我們建立一個(gè)類庫,將它生成為HelloWorld.dll:

usingSystem;   namespaceWebtest  ...{   publicinterfaceinterface1  ...{  intadd();   }  publicclassReflectTest:interface1  ...{   publicStringWrite;  privateStringWritec;   publicStringWritea  ...{  get  ...{  returnWrite;  }  set  ...{  Write=value;  }   }   privateStringWriteb  ...{  get  ...{  returnWritec;  }  set  ...{  Writec=value;  }   }   publicReflectTest()  ...{  this.Write="Write";  this.Writec="Writec";  }   publicReflectTest(stringstr1,stringstr2)  ...{  this.Write=str1;  this.Writec=str2;   }   publicstringWriteString(strings,intb)  ...{  return"歡迎您,"+s+"---"+b;;  }   publicstaticstringWriteName(strings)  ...{  return"歡迎您光臨,"+s;  }   publicstringWriteNoPara()  ...{  return"您使用的是無參數(shù)方法";  }   privatestringWritePrivate()  ...{  return"私有類型的方法";  }    publicintadd()  ...{  return5;  }  }  }

然后,建立再建立一個(gè)項(xiàng)目引入該HelloWorld.dll:

  1. usingSystem;  

  2.  

  3. usingSystem.Threading;  

  4. usingSystem.Reflection;  

  5.  

  6.  

  7. classTest  

  8. ...{  

  9. delegatestringTestDelegate(stringvalue,intvalue1);  

  10.  

  11. staticvoidMain()  

  12. ...{  

  13. //AssemblyAssemblyt=Assembly.LoadFrom("HelloWorld.dll");與下面相同的效果  

  14. AssemblyAssemblyt=Assembly.Load("HelloWorld");  

  15.  

  16.  

  17. foreach(Typeaaaint.GetTypes())  

  18. ...{  

  19. //Console.Write(aaa.Name);//顯示該dll下所有的類  

  20. }  

  21.  

  22.  

  23. Module[]modules=t.GetModules();  

  24.  

  25. foreach(Modulemoduleinmodules)  

  26. ...{  

  27. //Console.WriteLine("modulename:"+module.Name);//顯示模塊的名字本例為"HelloWorld.dll"  

  28. }  

  29.  

  30.  

  31. Typea=typeof(Webtest.ReflectTest);//得到具體的類的類型,和下面一個(gè)效果  

  32.  

  33. //Typea=t.GetType("Webtest.ReflectTest");//  

  34. //Console.Write(a.Name);  

  35.  

  36.  

  37. string[]bb=...{"aaaa","bbbbb"};  

  38. objectobj=Activator.CreateInstance(a,bb);//創(chuàng)建該類的實(shí)例,后面的bb為有參構(gòu)造函數(shù)的參數(shù)  

  39. //objectobj=t.CreateInstance("Webtest.ReflectTest");//與上面方法相同  

  40.  

  41.  

  42. MethodInfo[]miArr=a.GetMethods();  

  43. foreach(MethodInfomi0inmiArr)  

  44. ...{  

  45. //Console.Write(mi0.Name);//顯示所有的共有方法  

  46. }  

  47.  

  48.  

  49. MethodInfomi=a.GetMethod("WriteString");//顯示具體的方法  

  50. object[]aa=...{"使用的是帶有參數(shù)的非靜態(tài)方法",2};  

  51. strings=(string)mi.Invoke(obj,aa);//帶參數(shù)方法的調(diào)用  

  52.  

  53. MethodInfomi1=a.GetMethod("WriteName");  

  54. String[]aa1=...{"使用的是靜態(tài)方法"};  

  55. strings1=(string)mi1.Invoke(null,aa1);//靜態(tài)方法的調(diào)用  

  56.  

  57. MethodInfomi2=a.GetMethod("WriteNoPara");  

  58. strings2=(string)mi2.Invoke(obj,null);//不帶參數(shù)的方法調(diào)用  

  59.  

  60. MethodInfomi3=a.GetMethod("WritePrivate",BindingFlags.Instance|BindingFlags.NonPublic);  

  61. strings3=(string)mi3.Invoke(obj,null);//私有類型方法調(diào)用  

  62.  

  63. //Console.Write(s3);  

  64.  

  65.  

  66. PropertyInfo[]piArr=a.GetProperties
    (BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);  

  67. foreach(PropertyInfopiinpiArr)  

  68. ...{  

  69. //Console.Write(pi.Name);//顯示所有的方法  

  70. }  

  71.  

  72.  

  73. PropertyInfopi1=a.GetProperty("Writea");  

  74. //pi1.SetValue(obj,"Writea",null);  

  75. //Console.Write(pi1.GetValue(obj,null));  

  76.  

  77. PropertyInfopi2=a.GetProperty
    ("Writeb",BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);  

  78. pi2.SetValue(obj,"Writeb",null);  

  79. //Console.Write(pi2.GetValue(obj,null));  

  80.  

  81. FieldInfofi1=a.GetField("Write");  

  82. //Console.Write(fi1.GetValue(obj));  

  83.  

  84.  

  85. ConstructorInfo[]ci1=a.GetConstructors();  

  86. foreach(ConstructorInfociinci1)  

  87. ...{  

  88. //Console.Write(ci.ToString());//獲得構(gòu)造函數(shù)的形式  

  89. }  

  90.  

  91. ConstructorInfoasCI=a.GetConstructor(newType[]...{

  92. typeof(string),typeof(string)});  

  93. //Console.Write(asCI.ToString());  

  94.  

  95.  

  96. Webtest.interface1obj1=(Webtest.interface1)t.CreateInstance
    ("Webtest.ReflectTest");  

  97. Webtest.ReflectTestobj2=(Webtest.ReflectTest)t.CreateInstance("Webtest.ReflectTest");  

  98. //Console.Write(obj1.add());典型的工廠模式  

  99.  

  100.  

  101. foreach(Typettint.GetTypes())  

  102. ...{  

  103. if(tt.GetInterface("interface1")!=null)  

  104. ...{  

  105. Webtest.interface1obj3=(Webtest.interface1)Activator.CreateInstance(a);  

  106. //Console.Write(obj3.add());  

  107. }  

  108. }  

  109.  

  110.  

  111. TestDelegatemethod=(TestDelegate)Delegate.CreateDelegate
    (typeof(TestDelegate),obj,"WriteString");  

  112. //動(dòng)態(tài)創(chuàng)建委托的簡單例子  

  113. Console.Write(method("str1",2));  

  114. Console.Read();  

  115. }  

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI