众所周知,Reflection.Emit是非常强大的工具,可以在运行时动态生成各种程序集、类型和方法的IL代码,几乎无所不能。原先我也是这样认为的,但是看了某个人的博客之后我发现想要用Reflection.Emit做一些特殊的事情还是很需要技巧性的。假设你还没有看过那个人的博客(暂时先不公开……)可以尝试一下这个问题。下面的代码可以用vbc.exe正确编译(当然等价C#程序也可以经试验C#编译器无法处理该逻辑,各位参照VB的行为吧)。。。

Class AImplements B.I
End ClassClass BInherits AInterface IEnd Interface
End Class

代码的逻辑是这样的,A实现了接口I,而I是B的内嵌类型,B又继承自A。非常简单。使用TypeBuilder就可以生成这段逻辑了对吧?不太熟悉Reflection.Emit或者已经忘了怎么开始的朋友可以先参考一下下面的代码:

Imports System.Reflection
Imports System.Reflection.EmitModule ProgramSub Main()Dim name = New AssemblyName("test")Dim dasm = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave)Dim dmod = dasm.DefineDynamicModule(name.Name, name.Name + ".dll")Dim tA = dmod.DefineType("A", TypeAttributes.Public Or TypeAttributes.Class)Dim tB = dmod.DefineType("B", TypeAttributes.Public Or TypeAttributes.Class, tA)Dim tI = tB.DefineNestedType("I", TypeAttributes.NestedPublic Or TypeAttributes.Interface Or TypeAttributes.Abstract)tA.AddInterfaceImplementation(tI)'...'你需要完成这一部分逻辑,让test.dll包含刚才的三个类型'...dasm.Save(name.Name + ".dll")End Sub
End Module

注释的地方还没有写完,请你补全它,实现上面提到的那三个类型以及正确的关系。

(不需要翻译成C#了吧,基本上只需要把Dim改成var再加个分号就是C#了……)

老实说我也是刚刚知道了大概的方案,还没有动手实验,那就让我们一起开始动手做一做吧。

转载于:https://www.cnblogs.com/Ninputer/archive/2009/11/30/1613447.html

趣味问题:你能用Reflection.Emit生成这段代码吗?相关推荐

  1. 艾伟_转载:趣味问题:你能用Reflection.Emit生成这段代码吗?(答案)

    在上一篇博客中我提出了一个问题:如何用.NET的Reflection.Emit生成等价于下面VB代码的三个类型: Class A Implements B.I End Class Class B In ...

  2. .NET高级调试 | 通过JIT拦截无侵入调试 C# Emit 生成的动态代码

    大家还记得上一篇的测试代码吗?我们用了: Console.WriteLine("Function Pointer: 0x{0:x16}", Marshal.GetFunctionP ...

  3. 通过wsdl2java工具生成客户端段代码(wsdl2java -p cn.com.css.misps.graph.webservice.impl -d F:\src -all http://10.)

    首先当前是从官网下载cxf组件. Java代码 http://cxf.apache.org/download.html http://cxf.apache.org/download.html 下载后解 ...

  4. vscode 设置用户代码片段(怎么用命令式快速生成一段代码)

    1 依次点击设置-用户代码片段 如图 2 点击新建全局代码片段文件 如图 3 输入文件名称(自己命名) 回车进入该文件 如图 4 输入一下代码[cv即可]后 保存即可其中配置项 "prefi ...

  5. 生成一段代码,能够判断双色球彩票是否中奖

    # 双色球开奖号码(前六位为红球,最后一位为蓝球) winning_numbers = [1, 2, 3, 4, 5, 6, 7]# 用户选择的号码 user_numbers = [1, 2, 3, ...

  6. Reflection.Emit的使用场景、工具包及示例总结

    最近处理一个业务需要动态的生成一些业务模型和库,使用到了Emit的处理,相关的资料整理一下供参考. Reflection.Emit目的 使用的场景: 应用中自定义一个自己的语言 运行中动态的创建类型. ...

  7. 9.动态生成实体类,根据XML模板使用Emit生成动态类绑定到DataGrid

    在实际项目中,我们可能会遇到用户自定义XML模板字段,根据这个模板上的字段来显示相应的字段的值到DataGrid.在这种情况下,需要使用 XmlReader解析获取这个用户自定义的XML模板上有哪些字 ...

  8. Unity编译器 《策划表编表工具》 Excel转Json自动生成解析c#代码

    Unity编译器 <策划表编表工具> Excel转Json自动生成解析c#代码 1.表格数据结构解释 2.Excel文件路径 3.C#代码与Json自动生成路径 点击下载依赖Dll程序集 ...

  9. GitHub开源:一键生成前后端代码神器

    目录 1.技术架构 2.微服务架构图 3.业务应用 本篇博客将为朋友们分享一款神器:JeecgBoot. JeecgBoot 是一款基于代码生成器的低代码开发平台,零代码开发.采用前后端分离架构:Sp ...

最新文章

  1. java 字符串常用函数_Java学习(5)——字符串常用函数
  2. jQuery 对象和 DOM 对象
  3. 2020-11-16(常见加密算法统计)
  4. 博士申请 | 佐治亚理工学院陈永昕教授招收机器学习理论方向博士生
  5. JAVA Collection笔记(2012/9/19)
  6. 上班划水神器:一个可以在控制台玩斗地主的项目!
  7. 李开复老师的《给中国学生的第一封信——从诚信谈起》
  8. 树莓派制作语音对话机器人
  9. ubuntu安装显卡驱动后无法进入系统
  10. 【已失效】创维DT741-csf光猫管理员/root超级密码获取方法
  11. 项目管理常用图(甘特图、WBS、燃尽图)了解
  12. 清华姚班和100个“张小龙”| 中国AI天才养成计划
  13. 【前端】零基础带你入门前端< 三 > —— 实现手机通讯录(微信通讯录)等
  14. 传奇装备信息悬浮框(悬浮框在哪里可以弄出来)
  15. 2022哈工大计算机组成原理大作业——给定指令系统的处理器设计
  16. Ios热更新,实时代码更新,动态更新,动态库framework
  17. 硬件设计——BUCK电路仿真设计
  18. 失物招领小程序_上线了!| 失物招领平台全新上线!
  19. jmeter接口测试3-正则表达式提取器的使用
  20. 网络购车平台哪家强?

热门文章

  1. JVM 调优实战--JVM字节码
  2. JVM 调优实战--使用jstack分析线程执行情况
  3. MySQL之优化器、执行计划、简单优化
  4. Hadoop大数据——mapreduce中的Combiner/序列化/排序初步
  5. dms系统与mysql_关于MySQL与DMsql探寻
  6. c 调用c语言形参为double,C学生作业,’%f’需要’float *’类型的参数,但参数2的类型为’double *’...
  7. Oracle原理:11g的体系结构
  8. Win32控制台程序如何使用CString的方法
  9. ‘a’、“a”、‘abc’和“abc”的区别
  10. android xml文件格式,android xml 资源文件中几个格式(@ ? @* @+)的含义