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

简介: 众所周知,Reflection.Emit是非常强大的工具,可以在运行时动态生成各种程序集、类型和方法的IL代码,几乎无所不能。原先我也是这样认为的,但是看了某个人的博客之后我发现想要用Reflection.Emit做一些特殊的事情还是很需要技巧性的。

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

 
 
Class A
Implements B.I
End Class

Class B
Inherits A
Interface I

End Interface
End Class

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

 
 
Imports System.Reflection
Imports System.Reflection.Emit

Module Program
Sub 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#了……)

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

目录
相关文章
|
6月前
|
JavaScript 前端开发
js开发:请解释什么是事件委托(event delegation),并给出一个示例。
事件委托是JavaScript中优化事件处理的技术,通过绑定事件处理器到共享的父元素,利用事件冒泡机制来处理子元素的事件。这种方法能提升性能、简化代码并降低内存消耗。示例展示了如何在父元素上监听`click`事件,然后通过`event.target`识别触发事件的具体子元素(如`<li>`),实现对动态生成列表项的点击事件处理。
49 1
|
6月前
|
存储 传感器 JavaScript
NUS CS1101S:SICP JavaScript 描述:三、模块化、对象和状态(4)
NUS CS1101S:SICP JavaScript 描述:三、模块化、对象和状态(4)
99 0
|
6月前
|
存储 JavaScript 前端开发
NUS CS1101S:SICP JavaScript 描述:三、模块化、对象和状态(1)
NUS CS1101S:SICP JavaScript 描述:三、模块化、对象和状态(1)
50 0
|
6月前
|
存储 前端开发 JavaScript
NUS CS1101S:SICP JavaScript 描述:三、模块化、对象和状态(2)
NUS CS1101S:SICP JavaScript 描述:三、模块化、对象和状态(2)
94 0
|
6月前
|
存储 JavaScript 前端开发
NUS CS1101S:SICP JavaScript 描述:三、模块化、对象和状态(3)
NUS CS1101S:SICP JavaScript 描述:三、模块化、对象和状态(3)
63 0
29avalon - 指令ms-duplex(数据验证)
29avalon - 指令ms-duplex(数据验证)
41 0
|
前端开发 JavaScript
参透JavaScript中的call和apply
对于前端工程师来说,call、apply算是常用的函数方法,允许通过函数和在函数调用中指定this的指向。那么这两个方法到底有什么区别呢?本文将详细介绍这两个方法,顺便加深对其理解。
107 0
参透JavaScript中的call和apply
|
存储 编译器 API
OC底层知识(八) : block
OC底层知识(八) : block
120 0
OC底层知识(八) : block
OnComponentBeginOverlap.AddDynamic 的编译错误【UE4】
OnComponentBeginOverlap.AddDynamic 的编译错误【UE4】
301 0
OnComponentBeginOverlap.AddDynamic 的编译错误【UE4】
艾伟_转载:趣味问题:你能用Reflection.Emit生成这段代码吗?(答案)
在上一篇博客中我提出了一个问题:如何用.NET的Reflection.Emit生成等价于下面VB代码的三个类型: Class AImplements B.IEnd ClassClass BInherits AInterface IEnd InterfaceEnd Class 这个问题的难点在于三个类型有循环依赖关系:A实现了接口B.I,因此A依赖于I;B是A的子类,因此B依赖于A;接口I是B的嵌套类型,因此I依赖于B。
848 0