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,如需转载请自行联系原作者
目录
打赏
0
0
0
0
235
分享
相关文章
C# 去掉字符串最后一个字符的 4 种方法
在实际业务中,我们经常会遇到在循环中拼接字符串的场景,循环结束之后拼接得到的字符串的最后一个字符往往需要去掉,看看 C# 提供了哪4种方法可以高效去掉字符串的最后一个字符
604 0
C# 比较对象新思路,利用反射技术打造更灵活的比较工具
中途接手的项目,碰到需要在更新对象信息时比较并记录差异的需求,最变态的还有附加要求,怎么办?有没有既能满足需求又能对项目影响最小的方法呢?分享这个我封装的方法,一个利用反射技术打造的更灵活的比较工具
|
6月前
|
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
165 65
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
129 2
|
5月前
|
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
222 3
|
6月前
|
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
119 1
|
7月前
|
C#
C#一分钟浅谈:Lambda 表达式和匿名方法
本文详细介绍了C#编程中的Lambda表达式与匿名方法,两者均可用于定义无名函数,使代码更简洁易维护。文章通过基础概念讲解和示例对比,展示了各自语法特点,如Lambda表达式的`(parameters) =&gt; expression`形式及匿名方法的`delegate(parameters)`结构。并通过实例演示了两者的应用差异,强调了在使用Lambda时应注意闭包问题及其解决策略,推荐优先使用Lambda表达式以增强代码可读性。
112 8
|
6月前
|
C#
C#的方法的参数传递
C#的方法的参数传递
67 0
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
113 0
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
295 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等