`
izuoyan
  • 浏览: 8950962 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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. }


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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics