文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#中反射方法的用法

2023-06-18 00:35

关注

这篇文章主要讲解了“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.  

  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);//得到具体的类的类型,和下面一个效果  

  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);//创建该类的实例,后面的bb为有参构造函数的参数  

  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=...{"使用的是带有参数的非静态方法",2};  

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

  52.  

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

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

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

  56.  

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

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

  59.  

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

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

  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());//获得构造函数的形式  

  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. //动态创建委托的简单例子  

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

  114. Console.Read();  

  115. }  

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯