利用Type.InvokeMember调用指定函数

需求:利用反射实现父模块根据参数动态调用三个子模块。

        /// <summary>
        /// 加载子模块
        /// </summary>
        /// <param name="assemblyName">子模块程序集名称</param>
        /// <param name="className">要调用的指定函数所在的程序集函数名</param>
        private void Load(string assemblyName,string className)
        {
            string fileDll = string.Format("{0}\\{1}", Path.GetDirectoryName(typeof(Program).Assembly.Location), assemblyName);//typeof的参数是当前类名

            if (!File.Exists(fileDll))
            {
                MessageBox.Show("启动失败,系统将退出!");
                Application.Exit();
                return;
            }

            try
            {
                Assembly assembly = Assembly.LoadFile(fileDll);
                Type type = assembly.GetType(className);
                type.InvokeMember("Run", BindingFlags.InvokeMethod, null, null, null);
            }
            catch
            {
                MessageBox.Show("启动失败,系统将退出!");
                Application.Exit();
            }
        }

反射的缺点:

1.反射会造成编译时无法保证类型安全性。由于反射要严重依赖字符串,所以会丧失编译时的类型安全性。

2.反射速度慢。使用反射时,类型及其成员的名称在编译时未知;要用字符串名称标识每个类型及其成员,以便在运行时发现它们。。也就是说,使用System.Reflection命名空间中的类型扫描程序集的元数据时,反射要不断地执行字符串搜索。通常,字符串搜索执行的是不区分大小写的比较,这会进一步影响速度。

使用反射调用一个成员时,也会对性能产生影响。用反射调用一个方法时,首先必须将实参打包(pack)成一个数组;在内部,反射必须将这些实参解包(unpack)到线程栈上。此外,在调用方法前,CLR必须检查实参具有正确的数据类型。最后,CLR必须确保调用者正确的安全权限来访问被调用的成员。

基于上述原因,最好避免利用反射来访问字段或者调用方法/属性。

如果要写一个应用程序来动态发现和构造类型实例,应采取以下两种技术之一。

1.让类型从一个编译时已知的基类型派生。在运行时,构造派生类型的一个实例,将对它的引用放到基类型的一个变量中(利用转型),再调用基类型定义的虚方法。

2.让类型从一个编译时已知的接口。在运行时,构造类型的一个实例,将对它的引用放到接口类型的一个变量中(利用转型),在调用接口定义的方法。

时间: 2024-10-07 03:53:49

利用Type.InvokeMember调用指定函数的相关文章

Shell脚本通过参数传递调用指定函数

我们在写一些功能性脚本的时候,往往会把操作相似或者参数类似行为接近的函数放在同一个shell脚本中,这样管理方便,维护简单,也很清晰.对于这种情况,通常的办法是,在shell脚本中定义所有用到的函数,然后在正文代码中用case语句读入输入的命令函数参数来调用指定的相应函数.这样就达到一个shell脚本使用的强大功能. 下面以一个简单的例子来说明.一个计算器提供了加减乘除的功能: #!/bin/bash usage="Usage: `basename $0` (add|sub|mul|div|al

Swift中利用AppDelegate实现调用指定ViewController中的函数

接着上一篇的Blog讲,在我们自定义了TableViewCell之后,我们可能需要点击cell里面的button等操作,比如点击了以后跳转到别的页面,这个时候,因为跳转动作是在tableview所在的viewcontroller(假设为A类)实现的,所以,我们需要在tablewViewCell类里面调用A类的一个实例,这个实例一般是通过AppDelegate类实现的. 具体来看一下实现过程. 我们先来看一下整体的需求: 在"基站列表"这个ViewController里面,我们的Tabl

织梦调用指定顶级栏目或当前子栏目名称的方法

有时候我们会在列表页或者内容详情页调用指定的顶级栏目名称及链接,试了很多方法,有的只能调用所有顶级栏目或者是该频道下面的子栏目,实在是让人感到费解..下面说说各种栏目名称的调用方法:  1.{dede:field name="typename"} 这是调用当前栏目的名称 2.{dede:channel type='son' row='5'} <a href="[field:typeurl/]">[field:typename/]</a> {/

get_posts()函数wordpress调用指定ID文章多篇文章

wordpress内置函数get_posts()用于调用指定的一篇或多篇文章,函数提供多个参数,可以设置调用文章的指定分类.自定义字段.文章类型.文章状态.显示顺序等条件,文章以数组的形式返回,通过循环语句输出即可. 代码结构: 1 <?php get_posts($args);?> 返回数组型的变量,$args是该函数必要的变量 变量$args参数: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

C/C++利用gsoap库调用WebService

C/C++调用WebService需要用到soap库,一般使用的有gsoap和axis cpp两种实现,这里使用gsoap来调用.gsoap可以在 linxu.windows.mac多种平台上使用. gsoap的主页地址是http://gsoap2.sourceforge.net/ 新建一个WebService: 1 //写一个简单的方法 2 [WebMethod(Description="返回字符串")] 3 public string HelloWorld(string str)

C#调用windowsAPI函数

一 调用格式 C#在调用windowsAPI函数接口的时候有一套专门的调用流程 首先我们在调用API函数的时候必须引用命名空间InteropServices using System.Runtime.InteropServices; 例如我们想调用windows的kernel32.dll动态库中的接口函数中的AllocConsole()控制台函数接口 下面我们用最简单的调用形式来声明调用此函数接口(空方法,即方法体为空) [DllImport("kernel32.dll")] publ

在Julia语言中调用Python函数

在PyCall扩展包中,模仿Python的import语句,提供了一个可以导入Python模块的@pyimport宏.并且,为能在Julia中使用模块内的函数和常量做了封装,以及支持在Julia与Python间的自动类型转换. 同时,它还提供了对Python对象进行底层操作的设施.其中包括能与不透明的Python对象相对应的'PyObjec'类型,以及在Julia语言中对Python函数进行调用且做类型转换的pycall. 安装 在Julia中,只需要使用Pkg.add("PyCall"

C#实现百度地图附近搜索&amp;调用JavaScript函数

前一篇文章"C#调用百度地图API入门&解决BMap未定义问题"讲述了如何通过C#调用百度API显示地图,并且如何解决BMap未定义的问题.这篇文章主要更加详细的介绍百度地图的一些功能,包括附近搜索.城市搜索.路线规划.添加覆盖物等等. 希望文章对你有所帮助!如果文章中有不足之处,还请海涵~ 百度官方文档:http://developer.baidu.com/map/jsmobile.htm 官方DEMO例:http://developer.baidu.com/map/jsde

如何利用jquery在任意指定li元素后面插入新的li元素

如何利用jquery在任意指定li元素后面插入新的li元素:本章节介绍要一下如何利用jquery实现将一个新的li元素插入到任意li元素的后面.原生的javascript可以使用insertBefore()函数,具体可以参阅javascript的insertBefore.insertAfter和appendChild简单介绍一章节.下面介绍一下如何利用jquery实现此功能.代码实例: <!DOCTYPE html><html><head> <meta chars