C#反射

在C#的反射中,可以通过Type来执行类中的某个方法,也可以通过MethodInfo来执行方法

三种调用方法

下面的示例中使用了三种方法来执行方法

两个类:Class1和Demo1,通过反射执行Class1中的AddNum()方法和 反射执行Demo1中的Mult()方法

  1. using System;
  2. using System.Reflection;
  3.  
  4. namespace MyReflection
  5. {
  6. public class Class1
  7. {
  8. //将要反射的方法
  9. public int AddNum(int numb1, int numb2)
  10. {
  11. int sum = numb1 + numb2;
  12. return sum;
  13. }
  14. }
  15.  
  16. public class Demo1
  17. {
  18. public static int Mult(int numb1, int numb2)
  19. {
  20. return numb1 * numb2;
  21. }
  22.  
  23. static void Main(string[] args)
  24. {
  25. //获取Class1的Type
  26. Type class1Type = typeof(Class1);
  27. //本地或远程创建对象的实例
  28. object obj = Activator.CreateInstance(class1Type);
  29. object[] mParam = new object[] { 5, 10 };//构造一个object数组作为参数
  30.  
  31. //方法一:调用(invoke) 方法(AddNum),并传递参数
  32. int result1 = (int)class1Type.InvokeMember("AddNum", BindingFlags.InvokeMethod,null, obj, mParam);
  33. Console.Write("******直接调用方法******\n {0} \n", result1);
  34.  
  35. //方法二
  36. MethodInfo method = class1Type.GetMethod("AddNum", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
  37. int result2 = (int)method.Invoke(obj, mParam);
  38. Console.WriteLine("*******使用MethodInfo*********\n {0}\n", result2);
  39.  
  40. //方法三:本类的方法 修饰符为static
  41. MethodInfo method1 = Type.GetType("MyReflection.Demo1").GetMethod("Mult");//这里需要加上NameSpace
  42. int mult = (int)method1.Invoke(null, mParam);
  43. Console.WriteLine("*****本类中的方法***** \n{0}\n",mult);
  44. }
  45. }
  46. }

示例解释

GetMethod:Type类有个GetMethod方法,调用该方法可以获取指定方法名的方法信息实例。

使用时,其参数一般为2个,一个是方法名称字符串(可设置条件忽略大小写),另外一个参数为搜索方法的条件枚举。

该方法返回的是MethodInfo类型的实例,获取到了这个实例之后,我们就可以调用并执行该方法了。

MethodInfo method = type.GetMethod( funcName , BindingFlags.IgnoreCase | BindingFlags.Static | BindingFlags.Public );

这里要注意,搜索条件枚举,即第2个参数,要包含BindingFlags.Public,否则会返回NULL的。

如果是静态的方法,还要设置一个条件BindingFlags.Static。

得到了MethodInfo实例后,反射执行该方法:

method.Invoke( obj, arrParam );

obj为调用方法所属的类型实例,如果调用的为静态方法,可设置为null;arrParam为方法参数数组。

实际应用

任务系统:任务系统,程序制作好功能单元,策划填表进行不同的任务,每一条任务的Type,Arg供程序使用。

思路:把功能单元写好,执行本类的Method

应用示例

  1. public class CMission
  2. {
  3. public static void DoMission(CMissionInfo missionInfo)
  4. {
  5. var template = missionInfo.Template;
  6. //找到本類中的方法
  7. var method = typeof (CMission).GetMethod( string.Format("Do{0}", template),
  8. System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public |System.Reflection.BindingFlags.NonPublic);
  9.  
  10. if (method == null)
  11. {
  12. CDebug.LogError("未处理的Mission行为:{0}-{1} ,Mission:{2}",missionInfo.Id,missionInfo.Name, missionInfo.Template);
  13. return;
  14. }
  15.  
  16. //執行方法,传参数
  17. method.Invoke(null, new object[] {missionInfo.TemplateArgs});
  18.  
  19. }
  20.  
  21. static void DoLevel(string args)
  22. {
  23. if (CTool.IsNumber(args))
  24. {
  25. CUILevelList.DoLevelById(args.ToInt32());
  26. }
  27. else
  28. CDebug.LogError("请检查,任务进入关卡Id {0} 不是数字",args);
  29. }
  30.  
  31. //挑战普通关[主线]
  32. static void DoNormalLevel(string args)
  33. {
  34. CUIChapterList.ShowNormal();
  35. }
  36. }

C# Reflection Type/MethodInfo的更多相关文章

  1. C# 反射Reflection——反射反射程序员的快乐

    一.什么是反射 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata. 反射是无处不在的,MVC-Asp.Ne ...

  2. .NET 反射(Reflection)

    这节讲一下.NET 中的一个技术:反射(Reflection). 反射是一种很重要的技术,它可以在程序运行时,动态的获取类的实例,并调用实例中的任何方法.它就像一面镜子,映射出一个类的所有细节.    ...

  3. 02.反射Reflection

    1. 基本了解 1.1 反射概述 文字说明 审查元数据并收集关于它的类型信息的能力称为反射,其中元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个 ...

  4. 23 The Laws of Reflection 反射定律:反射包的基本原理

    The Laws of Reflection  反射定律:反射包的基本原理 6 September 2011 Introduction 介绍 Reflection in computing is th ...

  5. Golang高效实践之interface、reflection、json实践

    前言 反射是程序校验自己数据结构和类型的一种机制.文章尝试解释Golang的反射机制工作原理,每种编程语言的反射模型都是不同的,有很多语言甚至都不支持反射. Interface 在将反射之前需要先介绍 ...

  6. C#进阶学习4--反射(Reflection)

    一.反射的定义 审查元数据并收集关于它的类型信息的能力. 二.基础概念 (1)Assembly:定义和加载程序集,加载在程序集中的所有模块以及从此程序集中查找类型并创建该类型的实例. (2)Modul ...

  7. Java中Type接口及其子类

    简介 Type是Java 编程语言中所有类型的公共高级接口,和Object不同,Object是所有类的父类,即Object是Type的父类. 分类 原始类型(Class):不仅仅包含我们平常所指的类, ...

  8. 再谈使用Emit把Datatable转换为对象集合(List<T>)

    一.前因和存在的问题 前面我写了一篇<使用Emit把Datatable转换为对象集合(List<T>)>的博文,其实起源于我自己编写的一个orm工具(见前面几篇博文有介绍),里 ...

  9. DataTable转Entity(Emit版)

    public static List<T> ToList<T>(DataTable dt)        {            List<T> list = n ...

随机推荐

  1. Linux下安装配置Nexus

    一.安装和运行nexus 1.下载nexus:http://www.sonatype.org/nexus/go 可选择tgz和zip格式,以及war,选择tgz或zip时不同版本可能在启动时存在一定问 ...

  2. HTML中行内元素的竖直方向的padding和margin是否真的无效

    参考资料:Inline elements and padding 今天写一个导航栏时遇到了一个问题:行内元素的padding-top,padding-bottom和margin-top,margin- ...

  3. LIST-PROCESSING用法 ABAP任意时刻进行List输出_SAP

    如何在SAP的Screen中编写List报表 1.相关命令LEAVE TO LIST-PROCESSING [AND RETURN TO SCREEN <nnnn>].LEAVE LIST ...

  4. 独立博客开张!有关读书、GTD和IT方面的内容将发布在新网站上

    2015年自己建个独立博客http://www.shenlongbin.com,以后与读书.GTD和IT技术有关的主题都放在个人博客中,2015年计划基本制定,请移步到这里. 感谢博客园提供了如此优秀 ...

  5. mysql innoDB 挂了的临时解决方案

    Mysql InnoDB: Error: checksum mismatch by Mattias Hemmingsson on December 23, 2013 in Linux • 6 Comm ...

  6. swift GCD使用指南

    swift GCD使用指南 Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适 ...

  7. 网络开始---多线程---GCD-01-基本使用(掌握)(六)

    /** GCD两个核心概念:任何和队列 任务:执行什么操作 队列:用来存放任务 使用就2个步骤 1.定制任务 2.将任务添加到队列中 任务的取出队列原则:FIFO原则: 先进先出,后进后出 */ #i ...

  8. iOS 秒数转换成时间,时,分,秒

    //转换成时分秒 - (NSString *)timeFormatted:(int)totalSeconds{ int seconds = totalSeconds % 60;     int min ...

  9. PHP session 跨子域问题

    今天,做项目时候遇到个问题.之前做东西的时候session一般就直接存在数据库中这样就能解决跨域 不仅仅是跨子域,但是今天遇到这个问题是,自己要在别人现有的东西上面做修改.由于仅仅是子域 当时就行肯定 ...

  10. linux路由表命令

    转自此大神http://www.cnblogs.com/gunl/archive/2010/09/14/1826234.html 留在好查阅 linux 路由表维护 查看 Linux 内核路由表 使用 ...