反射发送实战(-)InvokeMember

C#反射详解 -载入 -遍历属性 -调用方法 -破坏单例(调用私有方法) -调用属性 -调用泛型方法 -https://blog.youkuaiyun.com/qq_29756987/article/details/95949288 立即下载

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

 

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

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;

namespace InvokeMember
{
   
///


   
/// Class1 的摘要说明。
   
///
    class Class1 { ///
       
/// 应用程序的主入口点。
       
///
        [STAThread]
       
static void Main(string[] args)
        {
           
//循环次数
            const int iterations = 100;
           
//计算所用时间
            DateTime startTime = DateTime.Now;
           
for(int i = 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 = new ReflectionTest();
           
//计算所用时间
            startTime = DateTime.Now;
           
for(int i = 0;i < iterations;i++)
            {
                t.DoOperation();
            }
           
            elasped
= DateTime.Now - startTime;

            Console.WriteLine(
"Looping Elapsed milliseconds:" + elasped.TotalMilliseconds + "for {0} iterations",iterations);
            Console.ReadLine();
        }
    }

   
///
   
/// Reflection 的摘要说明。
   
///
    public class ReflectionTest
    {
       
//保存动态生成并编译的类的type对象
        Type theType = null;
       
//保存动态生成类的实例
        object theClass = null;

       
///
       
/// 供Client调用的方法
       
///
        public void DoOperation()
        {
           
//未初始化
            if(theType == null)
            {
               
//初始化
                GenerateCode();
            }
           
//调用方法时的参数数组(此处为空)
            object[] arguments = new object[0];
           
//调用动态生成类的方法
            theType.InvokeMember("SayHello",//要调用的方法名
                BindingFlags.Default|BindingFlags.InvokeMethod,//Binding标志,具体参看msdn
                null,//使用默认Binding对象
                theClass,//在theClass实例上调用此方法
                arguments//调用方法时的参数数组
                );
        }

       
///
       
/// 运行时生成代码
       
///
        private void GenerateCode()
        {
           
//文件名
            string fileName = "Test";
           
//打开文件,如果不存在,则创建
            Stream s = File.Open(fileName + ".cs",FileMode.Create);
           
//创建一个StreamWriter来写入数据
            StreamWriter wrtr = new StreamWriter(s);
           
//写入动态创建类的源代码
            wrtr.WriteLine("// 动态创建Test类");

           
//类名
            string className = "TestClass";
            wrtr.WriteLine(
"using System;");
            wrtr.WriteLine(
"class {0}",className);
            wrtr.WriteLine(
"{");

            wrtr.WriteLine(
"/tpublic void SayHello()");
            wrtr.WriteLine(
"/t{");

            wrtr.WriteLine(
"/t/tConsole.WriteLine(/"Hello,World/");");
            wrtr.WriteLine(
"/t}");
            wrtr.WriteLine(
"}");

           
//关闭StreamWriter和文件
            wrtr.Close();
            s.Close();

           
//启动进程编译源文件
           
//指定参数
            ProcessStartInfo psi = new ProcessStartInfo();
           
//启动cmd.exe
            psi.FileName = "cmd.exe";
           
//cmd.exe的参数,/c-close,完成后关闭;后为参数,指定cmd.exe使用csc来编译刚才生成的源文件
            string compileString = "/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");
        }
    }
}

程序运行结果:

Hello,World
Hello,World

.

.

.

Looping Elapsed milliseconds:93.75 for 100 iterations

Hello,World
Hello,World

.

.

.

Looping Elapsed milliseconds:2875 for 100 iterations

性能上不占优势,主要是因为要进行写文件和编译的工作,但是后面的方法会对性能进行优化,到最后一个方法时性能会有大幅提高,但是最后一种方法的实用性不如前两种。

软件测试--用例篇(测试用例的好处、测试用例的七种设计方法、测试用例的粒度、测试用例的评价) 作为软件测试工程师,最主要的工作就是:编写测试用例,那么为什么要编写测试用例?它有什么好处?如何编写测试用例?测试用例写简单好还是复杂好?如何评价测试用例的质量? 天呐撸!能说不会吗?! 作为倾向软件测试工程师的老铁们,还是一起来学习吧! 一、编写测试用例的好处 测试用例是测试者的依据 测试用例使得工作可重复,是自动化测试的基础 补充:自动化测试的前提条件是:功能比较稳定,页面... 阅读详情

相关推荐

crazyswarm无人机集群搭建笔记(一)资料索引

crazyswarm无人机搭建笔记:资料收集

Coco_range的博客 806

InvokeMember C#

InvokeMember是C#中 反射动态调用 对象/类 的方法/字段/属性 时需要用到的方法。 通常使用InvokeMember方法时,参数如下: string name 方法/字段的名称 BindingFlags invokeAttr 枚举类BindingFlags代表需要动态调用的是哪种方法/字段,枚举值有Static、Public、NonPublic、InvokeMethod、GetField、SetField、GetProperty、SetProperty等多种枚举值(字段是Field,属性

woflyoycm的博客 1969

Slurm集群调度策略详解(1)-主调度

Slurm调度系统中针对作业的调度主要有三种,主调度,回填调度,GANG调度,这篇文章主要针对主调度进行解析。

h_m_l的博客 6029

C#多线程处理webbrowser及InvokeMember(click)无响应的问题

多线程处理webbrowser的相关问题,并解决触发click事件,js无响应问题。 最近刚好碰上一个需求:循环遍历网页元素,找到innerText为指定的内容时,就模拟人工点击。 解决办法:使用WebBrowser将指定位置的文档加载到 WebBrowser 控件中(注:这里的webbrowser是在拉控件的方式,而不是直接在代码中new) 源码如下: private void lo

cuoban的学习空间 3037

ANSYS Maxwell:创建即用型 3D 轴向磁通电机模型

Magnet Length” 是磁体的径向长度。“Magnet Thickness” 是磁体的轴向长度。为了对 AFM 进行更详细的分析,用户需要在 ANSYS Maxwell 中运行 3D FEA 分析。对于 2D 模型,它们类似于 MotorCAD 中的模型,后者对等效的直线电机进行建模。单击“确定”后,将创建一个 3D Maxwell 模型。“长度”是转子铁的轴向长度。然后需要定义定子的“磁芯”尺寸和材料。“长度”是定子铁芯的轴向长度。“转子”# 的极数必须与“定子”中定义的磁极相同。

jkh920184196的博客 1152

Sparse4Dv3

instance_feature也设置为nn.Parameter。修正分支2*(linear->relu->linear->relu->layernorm)->linear->scale,分类分枝2*(linear->relu->layernorm)->linear(256,9),质量评估分枝2*(linear->relu->layernorm)->linear(256,2)。每组两类instance,1是加上范围(-x,x)内均匀分布噪声,2是加上(-2x,-x)U(x,2x)范围内均匀分布噪声。

yuanl15的博客 1351

C# 学习笔记:反射

这篇文章重新写反射,在很久之前的那一篇博客中曾经非常粗劣的描述了一下反射的基础用法(感觉跟没讲一样),这一篇博客我们重新归纳一下反射,就像彩虹六号中重置赫里福基地一样。 反射这个功能来自于代码中的加载需求,因为我们代码中一个程序往往会有很多配套的程序集,这些程序集往往不是自己熟悉甚至自己见过的,它们可能来自于公司的另一个部门或者其他公司,也有可能在我们程序本体发布以后才发布的这些程序集,所以我们...

MEIGAZAMU 1110

手把手教你为智能手表DIY一个离线导航:LVGL + SD卡地图实战

本文详细介绍了如何为智能手表DIY一个离线导航系统,结合LVGL图形库和SD卡地图数据。从硬件选型、地图数据处理到LVGL地图引擎实现,提供了完整的实战指南,特别适合户外运动爱好者和嵌入式开发者。文章还分享了功耗优化、性能提升等实用技巧,帮助读者打造高效的离线导航解决方案。

weixin_42570484的博客 205

c# Type.InvokeMember用法

函数原型:  public object InvokeMember(string, BindingFlags, Binder, object, object[]); string:你所要调用的函数名 BindingFlags:你所要调用的函数的属性,可以组合 Binder:高级内容,可以先不看 object:调用该成员函数的实例 object[]:参数, 下面是msdn例子: //

fuck487的博客 1万+

8、Windows 部署ollama

一个本地运行大模型的集成框架,目前主要针对主流的LLaMA架构的开源大模型设计,通过将模型权重、配置文件和必要数据封装进由Modelfile定义的包中,从而实现大模型的下载、启动和本地运行的自动化部署及推理流程。此外,Ollama内置了一系列针对大模型运行和推理的优化策略,目前作为一个非常热门的大模型托管平台,已被包括LangChain、Taskweaver等在内的多个热门项目高度集成。

Andy_shenzl的博客 1131

单片机应用案例:ESP32 搭配 BH1750 光强传感器和 Web 服务器

在该应用案例中,我们将使用 ESP32 开发板作为主控制器,BH1750 光强传感器用于采集环境光强度数据,并通过 Web 服务器展示采集到的数据。步骤一:购买材料步骤二:连接硬件步骤三:编写代码我们将使用 Arduino IDE 编写代码,以下是主要代码:// WiFi 设置const char* ssid = “你的 WiFi 名称”;const char* password = “密码”;// Web 服务器实例// BH1750 实例// 获取当前光强度数据。

RlDart的博客 812

反射发送实战-InvokeMember 转

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

aiqixiao2017的博客 160

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

192

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

反射发送实战(-)InvokeMember [转载]

http://blog.codelphi.com/tmfc/archive/2004/08/24/20075.aspx 反射是.net中的高级功能之一,利用反射可以实现许多以前看来匪夷所思的功能,下面是我看了《Programming C#》(O'Reilly)之后对于反射的一点实践,本想直接做个应用程序来说明问题,但苦于工作繁忙并考虑到以简单为主,故先对反射发送(reflection emi...

weixin_30830327的博客 84

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

反射发送实战(-)InvokeMember [转载] 应为:动态调用才对。

声明:以前找(InvokeMember))动态调用实例的时候,找了这样一个实例。对文章的标题很是不解,后来查了相关资料,可以证实,这不是一个反射发送的例子,而是一个动态调用的例子,只是用到了动态联编技术而以,与实际的反射发送,是完全不同的两个概念。using System;using System.Diagnostics;using System.IO;using System.Ref

c8640的专栏 851

【性能压测实录】:从dynamic到InvokeMember,谁才是反射调用王者?

深入解析C# 4 dynamic 的反射调用性能瓶颈与优化方案,对比InvokeMember在高频调用场景下的执行效率。揭示动态调用核心机制,提升反射性能的关键实践,值得收藏。

LiteCode的博客 748

InvokeMember

xxxType.InvokeMember Method 这个是一个类型去反射某个方法,但是这个的好多个重载方法,长的一匹 不去好好理解,尼玛,太难受了。这不是很正常的吗? 重载1: InvokeMember(String,BindingFlags,Binder,Object,Object[],ParameterModifier[],CultureInfo,String[]) 重载2: ...

xLplus的博客 741

InvokeMember 使用

函数原型:       public   object   InvokeMember(string,   BindingFlags,   Binder,   object,   object[]);     string:你所要调用的函数名     BindingFlags:你所要调用的函数的属性,可以组合     Binder:高级内容,可以先不看     object:调用该成员函数的实例  

gooer的专栏 1万+

Activator.CreateInstance 与 Type.InvokeMember的区别

当谈到Activator.CreateInstancevs的性能结果时Type.InvokeMember,无参数构造函数的情况明显胜出:Activator.CreateInstance。但是当我们开始需要参数或使用带参数的主构造函数时,它开始均衡甚至有利于Type.InvokeMember。

仰望星空的博客 2079

dynamic与Type.InvokeMember谁更快?5个真实案例告诉你答案

对比C# 4 动态类型(dynamic)反射与Type.InvokeMember性能差异,通过5个真实场景揭示调用效率真相。涵盖动态调用、方法缓存、适用范围及关键优势,帮你选择更优方案。值得收藏

InstrWander的博客 1001
上一篇: C#小知识锦集
下一篇: 反射应用之一:根据控件名、属性名进行取值和赋值
qq_net
博客等级 码龄24年 13粉丝 210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值