C# Reflection Type/MethodInfo
C#反射
在C#的反射中,可以通过Type来执行类中的某个方法,也可以通过MethodInfo来执行方法
三种调用方法
下面的示例中使用了三种方法来执行方法
两个类:Class1和Demo1,通过反射执行Class1中的AddNum()方法和 反射执行Demo1中的Mult()方法
using System;
using System.Reflection; namespace MyReflection
{
public class Class1
{
//将要反射的方法
public int AddNum(int numb1, int numb2)
{
int sum = numb1 + numb2;
return sum;
}
} public class Demo1
{
public static int Mult(int numb1, int numb2)
{
return numb1 * numb2;
} static void Main(string[] args)
{
//获取Class1的Type
Type class1Type = typeof(Class1);
//本地或远程创建对象的实例
object obj = Activator.CreateInstance(class1Type);
object[] mParam = new object[] { 5, 10 };//构造一个object数组作为参数 //方法一:调用(invoke) 方法(AddNum),并传递参数
int result1 = (int)class1Type.InvokeMember("AddNum", BindingFlags.InvokeMethod,null, obj, mParam);
Console.Write("******直接调用方法******\n {0} \n", result1); //方法二
MethodInfo method = class1Type.GetMethod("AddNum", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
int result2 = (int)method.Invoke(obj, mParam);
Console.WriteLine("*******使用MethodInfo*********\n {0}\n", result2); //方法三:本类的方法 修饰符为static
MethodInfo method1 = Type.GetType("MyReflection.Demo1").GetMethod("Mult");//这里需要加上NameSpace
int mult = (int)method1.Invoke(null, mParam);
Console.WriteLine("*****本类中的方法***** \n{0}\n",mult);
}
}
}
示例解释
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
应用示例
public class CMission
{
public static void DoMission(CMissionInfo missionInfo)
{
var template = missionInfo.Template;
//找到本類中的方法
var method = typeof (CMission).GetMethod( string.Format("Do{0}", template),
System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public |System.Reflection.BindingFlags.NonPublic); if (method == null)
{
CDebug.LogError("未处理的Mission行为:{0}-{1} ,Mission:{2}",missionInfo.Id,missionInfo.Name, missionInfo.Template);
return;
} //執行方法,传参数
method.Invoke(null, new object[] {missionInfo.TemplateArgs}); } static void DoLevel(string args)
{
if (CTool.IsNumber(args))
{
CUILevelList.DoLevelById(args.ToInt32());
}
else
CDebug.LogError("请检查,任务进入关卡Id {0} 不是数字",args);
} //挑战普通关[主线]
static void DoNormalLevel(string args)
{
CUIChapterList.ShowNormal();
}
}
C# Reflection Type/MethodInfo的更多相关文章
- C# 反射Reflection——反射反射程序员的快乐
一.什么是反射 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata. 反射是无处不在的,MVC-Asp.Ne ...
- .NET 反射(Reflection)
这节讲一下.NET 中的一个技术:反射(Reflection). 反射是一种很重要的技术,它可以在程序运行时,动态的获取类的实例,并调用实例中的任何方法.它就像一面镜子,映射出一个类的所有细节. ...
- 02.反射Reflection
1. 基本了解 1.1 反射概述 文字说明 审查元数据并收集关于它的类型信息的能力称为反射,其中元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个 ...
- 23 The Laws of Reflection 反射定律:反射包的基本原理
The Laws of Reflection 反射定律:反射包的基本原理 6 September 2011 Introduction 介绍 Reflection in computing is th ...
- Golang高效实践之interface、reflection、json实践
前言 反射是程序校验自己数据结构和类型的一种机制.文章尝试解释Golang的反射机制工作原理,每种编程语言的反射模型都是不同的,有很多语言甚至都不支持反射. Interface 在将反射之前需要先介绍 ...
- C#进阶学习4--反射(Reflection)
一.反射的定义 审查元数据并收集关于它的类型信息的能力. 二.基础概念 (1)Assembly:定义和加载程序集,加载在程序集中的所有模块以及从此程序集中查找类型并创建该类型的实例. (2)Modul ...
- Java中Type接口及其子类
简介 Type是Java 编程语言中所有类型的公共高级接口,和Object不同,Object是所有类的父类,即Object是Type的父类. 分类 原始类型(Class):不仅仅包含我们平常所指的类, ...
- 再谈使用Emit把Datatable转换为对象集合(List<T>)
一.前因和存在的问题 前面我写了一篇<使用Emit把Datatable转换为对象集合(List<T>)>的博文,其实起源于我自己编写的一个orm工具(见前面几篇博文有介绍),里 ...
- DataTable转Entity(Emit版)
public static List<T> ToList<T>(DataTable dt) { List<T> list = n ...
随机推荐
- react与redux学习资料的整理
**重点内容**React学习 1.新手入门可以访问react的官方网站,如果英语不是特别好的同学可以访问中文版的,具体链接http://reactjs.cn/react/index.html 首页有 ...
- www.97top10.com--做最好的技术交流网站
www.97top10.com--做最好的技术交流网站
- 从web移动端布局到react native布局
在web移动端通常会有这样的需求,实现上中下三栏布局(上下导航栏位置固定,中间部分内容超出可滚动),如下图所示: 实现方法如下: HTML结构: <div class='container'&g ...
- 【读书笔记】iOS-防止通讯协议被轻易破解的方法
开发者可以选择类似Protobuf之类的二进制通讯协议或者自己实现通讯协议,对于传输的内容进行一定程度的加密,以增加黑客破解协议的难度. 参考资料: <iOS开发进阶> --唐巧
- 多线程基础(七)GCD线程组+栅栏函数
1.GCD队列组 拦截通知和等待所有任务全部结束在继续往下执行|阻塞 需求:下载两张图片,等两张图片都下载完毕之后,合成图片(这个实例,复习的时候一定要凭空敲出代码练习,好记性不如烂键 ...
- new与malloc的区别
看起来,它们的不同只是new比malloc用起来更方便而已.仅仅是这样吗?不是吗? 1 来源不同: 1)new/delete是C++中的操作符,而malloc/free是C中的标准库函数,需要库文件支 ...
- [QualityCenter]设置工作流脚本-新建缺陷时字段自动生成
需求:新建缺陷时,自动生成缺陷状态.检查者和检查日期的值. 在脚本编辑器找到Defects_Bug_New函数,然后填写以下代码: Sub Defects_Bug_New On Error Re ...
- MySQL的replace函数的用法
REPLACE(field,find_str,replace_str): 字段field的内容中的find_str 将被 替换为 replace_str . 例如: update short_url ...
- JSON、使用JSON进行数据交换的基础和原理
1. JSON 1.1. JSON 1.1.1. 什么是JSON JSON即Javascript对象表示法,是一种现在主流的数据交换格式.之所以应用广泛还是由其简单易读所决定的. 简单,只有六种类型的 ...
- 烂泥:NFS存储与VSphere配合使用
本文首发于烂泥行天下. 公司服务器的虚拟化使用的是VM ESXi 5.0,为了更有效的利用服务器的硬盘空间.就把所有的镜像文件存放到另外一台linux服务器上,这样在使用vsphere安装虚拟机时可以 ...