当前位置: 首页 > news >正文

c# 反射的使用方法,不知道是不是最全的

在网上查找了不少的资料,可以说大同小异,概念性的东西网上一搜一堆,今天把反射的东西整理了一下,供大家使用,我保证我这里是最全面的东西,当然也是基础的东西,在学好了这一切的基础上,大家可以学习反射的具体插件等应用,老鸟

就不用看了。首先我们建立一个类库,将它生成为HelloWorld.dll,

  1. usingSystem;

  2. namespaceWebtest
  3. {

  4. publicinterfaceinterface1
  5. {
  6. intadd();

  7. }
  8. publicclassReflectTest:interface1
  9. {

  10. publicStringWrite;
  11. privateStringWritec;

  12. publicStringWritea
  13. {
  14. get
  15. {
  16. returnWrite;
  17. }
  18. set
  19. {
  20. Write=value;
  21. }

  22. }

  23. privateStringWriteb
  24. {
  25. get
  26. {
  27. returnWritec;
  28. }
  29. set
  30. {
  31. Writec=value;
  32. }

  33. }

  34. publicReflectTest()
  35. {
  36. this.Write="Write";
  37. this.Writec="Writec";
  38. }

  39. publicReflectTest(stringstr1,stringstr2)
  40. {
  41. this.Write=str1;
  42. this.Writec=str2;

  43. }

  44. publicstringWriteString(strings,intb)
  45. {
  46. return"欢迎您,"+s+"---"+b;;
  47. }

  48. publicstaticstringWriteName(strings)
  49. {
  50. return"欢迎您光临,"+s;
  51. }

  52. publicstringWriteNoPara()
  53. {
  54. return"您使用的是无参数方法";
  55. }

  56. privatestringWritePrivate()
  57. {
  58. return"私有类型的方法";
  59. }


  60. publicintadd()
  61. {
  62. return5;
  63. }
  64. }
  65. }

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

  1. usingSystem;
  2. usingSystem.Threading;
  3. usingSystem.Reflection;
  4. classTest
  5. {
  6. delegatestringTestDelegate(stringvalue,intvalue1);
  7. staticvoidMain()
  8. {
  9. //Assemblyt=Assembly.LoadFrom("HelloWorld.dll");与下面相同的效果
  10. Assemblyt=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. //显示模块的名字本例为"HelloWorld.dll"
  19. //Console.WriteLine("modulename:"+module.Name);
  20. }

  21. //得到具体的类的类型,和下面一个效果
  22. Typea=typeof(Webtest.ReflectTest);
  23. //Typea=t.GetType("Webtest.ReflectTest");//
  24. //Console.Write(a.Name);
  25. string[]bb=...{"aaaa","bbbbb"};
  26. //创建该类的实例,后面的bb为有参构造函数的参数
  27. objectobj=Activator.CreateInstance(a,bb);
  28. //objectobj=t.CreateInstance("Webtest.ReflectTest");

  29. MethodInfo[]miArr=a.GetMethods();
  30. foreach(MethodInfomi0inmiArr)
  31. {
  32. //Console.Write(mi0.Name);//显示所有的共有方法
  33. }
  34. MethodInfomi=a.GetMethod("WriteString");//显示具体的方法
  35. object[]aa=...{"使用的是带有参数的非静态方法",2};
  36. strings=(string)mi.Invoke(obj,aa);//带参数方法的调用
  37. MethodInfomi1=a.GetMethod("WriteName");
  38. String[]aa1=...{"使用的是静态方法"};
  39. strings1=(string)mi1.Invoke(null,aa1);//静态方法的调用
  40. MethodInfomi2=a.GetMethod("WriteNoPara");
  41. strings2=(string)mi2.Invoke(obj,null);//不带参数的方法调用
  42. MethodInfomi3= a.GetMethod("WritePrivate",BindingFlags.Instance|
  43. BindingFlags.NonPublic);
  44. strings3=(string)mi3.Invoke(obj,null);//私有类型方法调

  45. //Console.Write(s3);
  46. PropertyInfo[]piArr=a.GetProperties(BindingFlags.Instance
  47. |BindingFlags.NonPublic|BindingFlags.Public);
  48. foreach(PropertyInfopiinpiArr)
  49. {
  50. //Console.Write(pi.Name);//显示所有的方法
  51. }
  52. PropertyInfopi1=a.GetProperty("Writea");
  53. //pi1.SetValue(obj,"Writea",null);
  54. //Console.Write(pi1.GetValue(obj,null));
  55. PropertyInfopi2=a.GetProperty("Writeb",
  56. BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);
  57. pi2.SetValue(obj,"Writeb",null);
  58. //Console.Write(pi2.GetValue(obj,null));
  59. FieldInfofi1=a.GetField("Write");
  60. //Console.Write(fi1.GetValue(obj));
  61. ConstructorInfo[]ci1=a.GetConstructors();
  62. foreach(ConstructorInfociinci1)
  63. {
  64. //Console.Write(ci.ToString());//获得构造函数的形式
  65. }
  66. ConstructorInfoasCI=a.GetConstructor(newType[]...{
  67. typeof(string),typeof(string)});
  68. //Console.Write(asCI.ToString());
  69. Webtest.interface1obj1=
  70. (Webtest.interface1)t.CreateInstance("Webtest.ReflectTest");
  71. Webtest.ReflectTestobj2=
  72. (Webtest.ReflectTest)t.CreateInstance("Webtest.ReflectTest");
  73. //Console.Write(obj1.add());典型的工厂模式
  74. foreach(Typettint.GetTypes())
  75. {
  76. if(tt.GetInterface("interface1")!=null)
  77. {
  78. Webtest.interface1obj3= (Webtest.interface1)Activator.CreateInstance(a);
  79. //Console.Write(obj3.add());
  80. }
  81. }
  82. TestDelegatemethod= (TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate),obj,
  83. "WriteString");
  84. //动态创建委托的简单例子
  85. Console.Write(method("str1",2));
  86. Console.Read();
  87. }
  88. }


在这里我把我们常用的方法,属性,等全部整理了出来,大家不要嫌弃乱,静下心来,自己按照我的分隔一部分一部分的来,保证你对反射的学习,会事半功倍.当然有关于其方法我会继续补充,想了这么些就先写下来吧.

相关文章:

  • 7.2 B树的定义、查找效率分析、B树的高度、插入和删除
  • RadControl For Asp.net的官方API
  • 7.3 B+树
  • 7.4 散列查找(散列表、常见的散列函数、除留余数法、直接定址法、数字分析法、平方取中法)
  • 对话实录——什么叫做无赖
  • 7.5 散列查找(开放定址法、线性探测法、平方探测法、伪随机序列法、再散列法)
  • 8.1 排序的基本概念(时间复杂度、空间复杂度、稳定性、内部排序、外部排序、可视化网站)
  • 8.2 插入排序(算法实现、效率分析、折半优化)
  • 手机二维码~~~ZXing简介
  • 8.3 希尔排序(算法实现、性能分析)
  • 8.4 冒泡排序(交换排序、算法实现、性能分析)
  • WPF的RichTextBox在处理汉字时的小BUG
  • 8.5 快速排序(交换排序、算法实现、性能分析)
  • Nebula3中的属性
  • 8.6 简单选择排序(选择排序、算法实现、性能分析)
  • bootstrap创建登录注册页面
  • echarts的各种常用效果展示
  • Electron入门介绍
  • java正则表式的使用
  • LeetCode18.四数之和 JavaScript
  • Mysql5.6主从复制
  • NSTimer学习笔记
  • PHP的Ev教程三(Periodic watcher)
  • Sass Day-01
  • 第2章 网络文档
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 学习使用ExpressJS 4.0中的新Router
  • 延迟脚本的方式
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • ionic异常记录
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (4)Elastix图像配准:3D图像
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)大型网站架构演变和知识体系
  • (转)母版页和相对路径
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [CC2642r1] ble5 stacks 蓝牙协议栈 介绍和理解
  • [CISCN2021 Quals]upload(PNG-IDAT块嵌入马)
  • [Codeforces] probabilities (R1600) Part.1
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
  • [IDF]啥?
  • [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流
  • [jQuery]10 Things I Learned from the jQuery Source
  • [LeetCode] 596:超过5名学生的课
  • [LeetCode] NO. 387 First Unique Character in a String
  • [NET].NET Framework 3.5 SP1 真正的离线安装(转)