C#的反射机制调用方法

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://mengliao.blog.51cto.com/876134/511804

.NET的反射(Reflection)是非常完善和强大的,例如有名的.NET反编译工具Red Gate's .NET Reflector就是使用了.NET自身的反射机制,这里有一个比较简单的实例(使用控制台程序),看看.NET中如何使用反射。

  
  
  1. using System;
  2. using System.Reflection;
  3. namespace Mengliao.CSharp.C13.S02
  4. {
  5. class MyClass
  6. {
  7. private int count;
  8. public MyClass(int value)
  9. {
  10. count = value;
  11. }
  12. public void m1()
  13. {
  14. Console.WriteLine("Called method 1.");
  15. }
  16. public static int m2(int x)
  17. {
  18. return x * x;
  19. }
  20. public void m3(int x, double y)
  21. {
  22. Console.WriteLine("Called method 3, paramaters: x = {0}, y = {1:E}.", x, y);
  23. }
  24. public void m4()
  25. {
  26. Console.WriteLine("Called method 4. Count = {0}", count);
  27. }
  28. private static string m5(double x) //私有静态方法,不能直接调用,但可以绑定到委托
  29. {
  30. return Math.Sqrt(x).ToString();
  31. }
  32. }
  33. class Program
  34. {
  35. public static void Main()
  36. {
  37. //取得MyClass的Type对象,下面的代码使用Type的静态方法需指明程序集,作用相同
  38. //Type t = Type.GetType("Mengliao.CSharp.C13.S02.MyClass, ConsoleApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
  39. Type t = typeof(MyClass);
  40. //通过Activator实例化MyClass,供实例方法调用
  41. object obj = Activator.CreateInstance(t, new object[] { 88 });
  42. MethodInfo[] methods = t.GetMethods(); //获取MyClass的所有方法列表
  43. foreach (MethodInfo nextMethod in methods) //枚举所有方法
  44. {
  45. Console.WriteLine(nextMethod.ToString()); //显示方法信息
  46. if (nextMethod.Name == "m1") //方法m1
  47. {
  48. nextMethod.Invoke(obj, null); //使用obj对象调用方法m1,无参数
  49. }
  50. if (nextMethod.Name == "m2") //方法m2
  51. {
  52. //静态方法,使用null调用方法m2,建立参数数组,传入10
  53. Console.WriteLine("Called static method 2, return {0}", nextMethod.Invoke(null, new object[] { 10 }));
  54. }
  55. }
  56. MethodInfo m3Info = t.GetMethod("m3"); //获取方法m3
  57. m3Info.Invoke(obj, new object[] { 123, 0.456 }); //调用方法m3,传入对应的2个参数
  58. //获取方法m4,使用obj对象调用方法,无参数
  59. t.InvokeMember("m4", BindingFlags.InvokeMethod, null, obj, null);
  60. //建立泛型委托runMe,并绑定MyClass的静态私有方法m5
  61. Delegate runMe = Delegate.CreateDelegate(typeof(Func<double, string>), t, "m5");
  62. Console.WriteLine("Call delegate with m5: Sqrt(2) = {0}", ((Func<double, string>)runMe)(2)); //调用该委托
  63. Console.ReadLine();
  64. }
  65. }
  66. }

使用反射机制可以调用各种方法,包括私有的、静态的等等,程序中的注释非常详细,这里就不多说了。

本文出自 “梦辽软件工作室” 博客,请务必保留此出处http://mengliao.blog.51cto.com/876134/511804

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值