C#中反射方法的用法

发布时间:2021-08-25 17:54:56 作者:chen
来源:亿速云 阅读:106

这篇文章主要讲解了“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#中反射方法的用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

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

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

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

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

相关阅读

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

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