C#中反射方法的用法

发布时间:2021-08-25 17:54:56 作者:chen
阅读:126
开发者专用服务器限时活动,0元免费领! 查看>>

这篇文章主要讲解了“C#中反射方法的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中反射方法的用法”吧!

首先我们建立一个类库,将它生成为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"您使用的是无参数方法";  }   privatestringWritePrivate()  ...{  return"私有类型的方法";  }    publicintadd()  ...{  return5;  }  }  }

然后,建立再建立一个项目引入该HelloWorld.dll:

  1. usingSystem;  

  2. usingSystem.Threading;  

  3. usingSystem.Reflection;  

  4. classTest  

  5. ...{  

  6. delegatestringTestDelegate(stringvalue,intvalue1);  

  7. staticvoidMain()  

  8. ...{  

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

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

  11. foreach(Typeaaaint.GetTypes())  

  12. ...{  

  13. //Console.Write(aaa.Name);//显示该dll下所有的类  

  14. }  

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

  16. foreach(Modulemoduleinmodules)  

  17. ...{  

  18. //Console.WriteLine("modulename:"+module.Name);//显示模块的名字本例为"HelloWorld.dll"  

  19. }  

  20. Typea=typeof(Webtest.ReflectTest);//得到具体的类的类型,和下面一个效果  

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

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

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

  24. objectobj=Activator.CreateInstance(a,bb);//创建该类的实例,后面的bb为有参构造函数的参数  

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

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

  27. foreach(MethodInfomi0inmiArr)  

  28. ...{  

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

  30. }  

  31. MethodInfomi=a.GetMethod("WriteString");//显示具体的方法  

  32. object[]aa=...{"使用的是带有参数的非静态方法",2};  

  33. strings=(string)mi.Invoke(obj,aa);//带参数方法的调用  

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

  35. String[]aa1=...{"使用的是静态方法"};  

  36. strings1=(string)mi1.Invoke(null,aa1);//静态方法的调用  

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

  38. strings2=(string)mi2.Invoke(obj,null);//不带参数的方法调用  

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

  40. strings3=(string)mi3.Invoke(obj,null);//私有类型方法调用  

  41. //Console.Write(s3);  

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

  43. foreach(PropertyInfopiinpiArr)  

  44. ...{  

  45. //Console.Write(pi.Name);//显示所有的方法  

  46. }  

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

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

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

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

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

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

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

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

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

  56. foreach(ConstructorInfociinci1)  

  57. ...{  

  58. //Console.Write(ci.ToString());//获得构造函数的形式  

  59. }  

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

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

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

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

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

  65. //Console.Write(obj1.add());典型的工厂模式  

  66. foreach(Typettint.GetTypes())  

  67. ...{  

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

  69. ...{  

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

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

  72. }  

  73. }  

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

  75. //动态创建委托的简单例子  

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

  77. Console.Read();  

  78. }  

感谢各位的阅读,以上就是“C#中反射方法的用法”的内容了,经过本文的学习后,相信大家对C#中反射方法的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读:
  1. c#中反射指的是什么
  2. 详解C#反射

开发者交流群:

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:C#运算符重载“>”的操作

下一篇:C#运算符的优先级介绍

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》
开发者交流群×