.Net——动态调用方法

一,使用InvokeMember

思路:在类型的type的对象上调用InvokeMember方法,传递要在其上调用方法的对象,并指定BindingFlags为InvokeMethod.根据方法签名,可能还需要传递参数。



示例(对普通方法和对静态方法的调用):

         #region 动态调用方法——使用InvokeMember对一般方法的调用

                //Type t = typeof(Calculator);
                //Calculator c = new Calculator(1, 2);
                //int result = (int)t.InvokeMember("Add", BindingFlags.InvokeMethod, null, c, null);
                //Console.WriteLine(result);

            #endregion

#region 动态调用方法——使用InvokeMember对静态含参数方法的调用

                //object[] paramas = { 6, 9 };
                //Type t = typeof(Calculator);
                //t.InvokeMember("Add", BindingFlags.InvokeMethod, null, t, paramas);//静态方法不是基于某个具体的类型实例,而是类型本身。方法参数还是以object数组传入的

            #endregion


二,使用MethodInfo.Invoke

使用思路:先通过type对象的getMethod方法,获取想要调用的方法对象,也就是Methodinfo对象,然后在该对象上调用Invoke方法。根据方法签名,可能还需要传递参数。


#region 动态调用方法——使用MethodInfo.Invoke调用方法

                Type t = typeof(Calculator);
                Calculator c = new Calculator(3, 4);
                MethodInfo mi = t.GetMethod("Add", BindingFlags.Instance | BindingFlags.Public);
                mi.Invoke(c, null);

 #endregion


其实有时候根据方法名称调用方法还是挺方便的,就是反射的带来的性能问题没有衡量过,都说性能不好,但是到底有多大影响,求解释?

时间: 2024-10-19 19:38:20

.Net——动态调用方法的相关文章

Struts2 动态调用方法

struts2动态调用方法有两种方式 方式一:用通配符进行调用: Action方法: 1 package com.bjyinfu.struts.actions; 2 3 public class CatchDynamicMethod { 4 5 public String doFirst(){ 6 System.out.println("执行doFirst方法"); 7 return "success"; 8 } 9 10 public String doSecon

自学ios开发-------Objective-c动态调用方法笔记

OC动态调用OC的函数调用是消息发送模式,即在运行时动态调用函数,OC在编译期可以调用任何函数,只要声明过这个函数,就不会报错,在真正运行的时候才会根据函数的名称找到对应的函数来调用[ASPerson SayHello] 编译时RunTime会将上述代码转化为objc_msgSend(ASPerson @selector(SayHello)) 所有定义的类型都继承自NSObject,NSObject中存在一个指向Class的指针 Class是指向objc_class结构的函数指针; struct

使用反射构造对象实例并动态调用方法

在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释如下: 反射提供了封装程序集.模块和类型的对象(Type 类型).可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性.如果代码中使用了属性,可以利用反射对它们进行访问. 主要用途: 动态加载DLL,实现插件机制. 实例化DLL中的类型. 执行后期

php中怎么使用call_user_func动态调用方法

php中可使用call_user_func进行方法的动态调用,可以动态调用普通函数.类方法以及带参数的类方法1.定义一个普通函数getCurrentDate,用于获取今天日期.call_user_func带上的参数为要被调用的函数名fucntion getCurrentDate(){echo 'getCurrentDate:' . date('Y-m-d');}call_user_func('getCurrentDate'); 程序会自动执行getCurrentDate函数并获得期望的结果get

通过反射调用动态调用方法

调用无返回值.无参数的方法 假如有一个BaseEntity类,我们要使用反射调用BaseEntity类中的A方法:首先我们必须要先声明一个Type类的实例: Type baseType=typeof(BaseEntity); 再来我们要再声明一个MethodInfo类的实例,用来寻找BaseEntity类中的方法:现在我们要调用BaseEntity类中的A方法,所以我们代码可以这样写 MethodInfo MeInfo=baseType.GetMethod("A"); 然后我们就可以使

Struts2中Action的动态调用方法

在Struts2中,Action执行的时候并不一定要执行execute,我们可以指定Action执行哪个方法,下面分别介绍三种方法来指定Action执行哪个方法: 1.第一种方法,通过Action里的method属性指定执行方法,我们可以在struts.xml配置文件中配置Action的时候用method="   " 来指定执行的哪个方法. (1).接下来附上一个例子,通过第一种方法来指定执行方法,首先,复制一个已经搭建好struts2环境的web项目,这里我们复制ActionTest

struts2 动态调用方法和使用通配符定义

struts2中无需配置就可以直接调用Action中非execute方法的方式,就是用struts2的动态方法调用.动态方法调用是在action 的名字中使用感叹号(!)来标示要调用的方法名,其语法格式为actionName!methodname.action,例如我们的 struts.xml的配置如下: <struts> <package name="struts" namespace="/user" extends="struts-d

Action的动态调用方法

Action执行的时候并不一定要执行execute方法,我们可以指定Action执行哪个方法: 1. 方法一(通过methed属性指定执行方法): 可以在配置文件中配置Action的时候用method=来指定执行哪个方法 <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add"> <result>/user_ad

Java反射:根据方法名动态调用方法,解决商品动态属性取值问题。

public class Goods{ private String goodsName; private String attr1; private String attr2; private String attr3; private String attr4; ......... private String attr20; setter/getter方法 } 在数据库表goods中,已知该商品的属性个数N(满足:N=5,attr1—attr5有值,attr6-attr20为空).问如何取