C#的反射机制调用方法

简介:

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

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

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










本文转自 BlackAlpha 51CTO博客,原文链接:http://blog.51cto.com/mengliao/511804,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
1月前
|
C#
C#学习相关系列之数组---常用方法使用(二)
C#学习相关系列之数组---常用方法使用(二)
|
1月前
|
存储 C# 数据库
C# 生成唯一ID,有哪些方法?
【2月更文挑战第12天】
161 0
|
3月前
|
编译器 C# 开发者
C# 11.0中的新特性:覆盖默认接口方法
C# 11.0进一步增强了接口的灵活性,引入了覆盖默认接口方法的能力。这一新特性允许类在实现接口时,不仅可以提供接口中未实现的方法的具体实现,还可以覆盖接口中定义的默认方法实现。本文将详细介绍C# 11.0中接口默认方法覆盖的工作原理、使用场景及其对现有代码的影响,帮助开发者更好地理解和应用这一新功能。
|
3月前
|
安全 C# 开发者
C#中的默认接口方法:接口演化的新篇章
【1月更文挑战第11天】本文探讨了C# 8.0中引入的默认接口方法,这一特性允许在接口中定义具有默认实现的方法。文章介绍了默认接口方法的语法、使用场景,以及它们如何影响接口的设计和实现,同时讨论了默认接口方法带来的好处和潜在的陷阱。
|
4月前
|
缓存 C#
C# 操作路径(Path)类方法的使用与解析运行实例
C# 操作路径(Path)类方法的使用与解析运行实例
|
1月前
|
C#
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
C#学习相关系列之数据类型类----嵌套类和嵌套方法(三)
|
1月前
|
开发框架 .NET C#
C#学习相关系列之Linq常用方法---排序(一)
C#学习相关系列之Linq常用方法---排序(一)
|
1月前
|
开发框架 .NET 编译器
C#学习相关系列之匿名方法和Lambda表达式
C#学习相关系列之匿名方法和Lambda表达式
|
1月前
|
C#
C#中保留小数点后N位的方法_kaic
C#中保留小数点后N位的方法_kaic