(转)反射发送实战(-)InvokeMember

摘要:
反射是.net中的高级功能之一,利用反射可以实现许多以前看来匪夷所思的功能,下面是我看了《ProgrammingC#》之后对于反射的一点实践,本想直接做个应用程序来说明问题,但苦于工作繁忙并考虑到以简单为主,故先对反射发送的使用做一些介绍。文章最后再给出一个实例。下面的程序在运行时生成了一个Test.cs文件,并调用csc编译成Test.dll文件,然后利用Type.InvokeMember()方法调用其中的SayHello()方法,然后和原始方法对比一下性能。///classClass1{//////应用程序的主入口点。

反射是.net中的高级功能之一,利用反射可以实现许多以前看来匪夷所思的功能,下面是我看了《ProgrammingC#》(O'Reilly)之后对于反射的一点实践,本想直接做个应用程序来说明问题,但苦于工作繁忙并考虑到以简单为主,故先对反射发送(reflection emit)的使用做一些介绍。文章最后再给出一个实例。

下面的程序在运行时生成了一个Test.cs文件,并调用csc编译成Test.dll文件,然后利用Type.InvokeMember()方法调用其中的SayHello()方法,然后和原始方法对比一下性能。

usingSystem;
usingSystem.Diagnostics;
usingSystem.IO;
usingSystem.Reflection;
namespaceInvokeMember
{
///<summary>
///Class1 的摘要说明。
///</summary>
classClass1 {///<summary>
///应用程序的主入口点。
///</summary>
[STAThread]
staticvoidMain(string[] args)
{
//循环次数
constintiterations=100;
//计算所用时间
DateTime startTime=DateTime.Now;
for(inti=0;i<iterations;i++) {//对照方法
Console.WriteLine("Hello,World");
}
TimeSpan elASPed=DateTime.Now-startTime;
Console.WriteLine("Looping Elapsed milliseconds:"+elasped.TotalMilliseconds+"for {0} iterations",iterations);
//使用反射发送
ReflectionTest t=newReflectionTest();
//计算所用时间
startTime=DateTime.Now;
for(inti=0;i<iterations;i++)
{
t.DoOperation();
}
elasped=DateTime.Now-startTime;
Console.WriteLine("Looping Elapsed milliseconds:"+elasped.TotalMilliseconds+"for {0} iterations",iterations);
Console.ReadLine();
}
}
///<summary>
///Reflection 的摘要说明。
///</summary>
publicclassReflectionTest
{
//保存动态生成并编译的类的type对象
Type theType=null;
//保存动态生成类的实例
objecttheClass=null;
///<summary>
///供Client调用的方法
///</summary>
publicvoidDoOperation()
{
//未初始化
if(theType==null)
{
//初始化
GenerateCode();
}
//调用方法时的参数数组(此处为空)
object[] arguments=newobject[0];
//调用动态生成类的方法
theType.InvokeMember("SayHello",//要调用的方法名
BindingFlags.Default|BindingFlags.InvokeMethod,//Binding标志,具体参看msdn
null,//使用默认Binding对象
theClass,//在theClass实例上调用此方法
arguments//调用方法时的参数数组
);
}
///<summary>
///运行时生成代码
///</summary>
privatevoidGenerateCode()
{
//文件名
stringfileName="Test";
//打开文件,如果不存在,则创建
Stream s=File.Open(fileName+".cs",FileMode.Create);
//创建一个StreamWriter来写入数据
StreamWriter wrtr=newStreamWriter(s);
//写入动态创建类的源代码
wrtr.WriteLine("// 动态创建Test类");
//类名
stringclassName="TestClass";
wrtr.WriteLine("using System;");
wrtr.WriteLine("class {0}",className);
wrtr.WriteLine("{");
wrtr.WriteLine(" public void SayHello()");
wrtr.WriteLine(" {");
wrtr.WriteLine(" Console.WriteLine("Hello,World");");
wrtr.WriteLine(" }");
wrtr.WriteLine("}");
//关闭StreamWriter和文件
wrtr.Close();
s.Close();
//启动进程编译源文件
//指定参数
ProcessStartInfo psi=newProcessStartInfo();
//启动cmd.exe
psi.FileName="cmd.exe";
//cmd.exe的参数,/c-close,完成后关闭;后为参数,指定cmd.exe使用csc来编译刚才生成的源文件
stringcompileString="/c C:\WINNT\Microsoft.NET\Framework\v1.1.4322\csc.exe /optimize+ /target:library {0}.cs";
psi.Arguments=String.Format(compileString,fileName);
//运行时的风格-最小化
psi.Windowstyle=ProcessWindowstyle.Minimized;
//启动进程
Process proc=Process.Start(psi);
//指定当前在此进程退出前等待
proc.WaitForExit();
//从编译好的dll文件load一个Assembly
Assembly a=Assembly.LoadFrom(fileName+".dll");
//创建类的实例
theClass=a.CreateInstance(className);
//取得此类实例的类型
theType=a.GetType(className);
//删除源文件
//File.Delete(flieName + ".cs");
}
}
}

免责声明:文章转载自《(转)反射发送实战(-)InvokeMember》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【vue】在移动端使用better-scroll 实现滚动效果Android自定义控件(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

怎样将shp文件的坐标点导出来?

单击以选择保存类型中的文本文件,将经度和纬度输出为txt格式。坐标系统有两个选项。第一个是数据源的坐标系。数据的数据源坐标系为UTM,投影坐标系,单位为米。第二个是我开始设置的数据帧的坐标系,即WGS84,单位为度。。。。直接将获得的点的坐标生成到文本文件中。如果它是栅格文件,则来自rastrastertopint的arctoolboxconverttool...

vs下调试程序时,把信息打印到输出窗口

重印:https://blog.csdn.net/cwj066/article/details/82423627 https://stackoverflow.com/questions/20508086/getting-rid-of-atltracegeneral-category-shown-in-atltrace-output方法1:编写一个变量参数函数...

关于利用RD client远程电脑,和输入法的一些问题

我在寝室,利用转接头,借助手机app“RDclient”成功完成在键盘上输入文字,并在电脑上输出内容。“RDclient”可以完成手机端远程连接电脑端,只需要知道电脑的ip,用户名和密码就可以。“RDclient”这是微软自家发布的软件,还是很不错的。不过,在刚开始连接的时候,输入法遇到一点问题。后来,在手机上,调出输入法打字的界面,更换成英文输入模式,然后...

linux 安装nginx

1.检查服务器上是否安装了nginx:nginx v2。查看编译参数:nginxv3。查看安装目录:rpm-qlnginx4。查看配置文件:/etc/logrotate D/nginx5。在安装nginx之前,请确保系统中安装了gcc、pcre-devel、zlib-devel和openssl-devel。5.1如果安装了rpm软件包,您可以使用rpm qa...

zookeeper 日志输出到指定文件夹

最近,我在学习ZookeperStormKafka。顺便说一下,我在本地建立了一个集群。我遇到了Zookeeper日志输出路径的问题。我发现设置log4j。Zookeeper中的属性无法解决日志路径问题。我发现解决方案如下:1.修改log4j属性,您应该能够更改它。我更改了红色粗体,但仍然没有生效。#定义要移动的默认值...

JQuery 导入导出 Excel

正在做一个小项目,从数据库中查询数据放在HTMLTable中.现在想要从这个table中导出数据来.另外用户需要选择导出的列.使用jQuery的导出插件可以完成这个需求.jQueryPlugintoExportHTMLTables例子:导入插件:[javascript]viewplaincopy˂/scr...