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

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

众所周知,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#了……)

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

免责声明:文章转载自《趣味问题:你能用Reflection.Emit生成这段代码吗?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇kubernetes client-go解析python中使用multipart/form-data请求上传文件下篇

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

相关文章

超简洁的随机粒子群算法(PSO)程序(C/C++)

#include"stdio.h" #include"stdlib.h" #include"time.h" #include"math.h"   const int NUM=40;//粒子数 const int DIM=30;//维数 const double c1=1.8;//参数 const double c2=1.8;//参数  ...

VBA学习_1:数据类型

VBA的数据类型 布尔型Boolean 整数:整数型Integer、字节型Byte、长整数型Long 小数:小数型Decimal、单精度浮点型Single、双精度浮点型Double、货币型Currency 字符串型Sting(定长和不定长) 日期型Date 对象型Object 变体型Variant 用户自定义类型 声明变量   Dim 变量名 As 数...

pytorch中torch.cat(),torch.chunk(),torch.split()函数的使用方法

一、torch.cat()函数 熟悉C字符串的同学们应该都用过strcat()函数,这个函数在C/C++程序中用于连接2个C字符串。在pytorch中,同样有这样的函数,那就是torch.cat()函数. 先上源码定义:torch.cat(tensors,dim=0,out=None) 第一个参数tensors是你想要连接的若干个张量,按你所传入的顺序...

批量修改outlook联系人头像,并同步手机

打开outlook按 ALT+F11打开宏编辑器,输入代码 Public Sub UpdateContactPhoto()     Dim myOlApp As Outlook.Application     Dim myNamespace As Outlook.NameSpace     Dim myContacts As Outlook.Items  ...

[vba]excel中求选中数据和为给定数所有的组合

昨天下午开始学习的vba,累死了,肯定有bug,待调试 vba程序如下: 1 Dim aSum As Integer 2 Dim tSum As Integer 3 Dim judge(30) As Integer 4 Dim arrMax As Integer 5 Dim arr 6 Dim location(30) As Integer...

python数据可视化案例——平行坐标系(使用pyecharts或pandas)

平行坐标是可视化高维几何和分析多元数据的常用方法。 为了在n维空间中显示一组点,绘制由n条平行线组成的背景,通常是垂直且等距的。所述的点N 维空间被表示为折线与顶点在平行的轴线; 第i 轴上顶点的位置对应于该点的第i个坐标。 此可视化与时间序列可视化密切相关,除了它应用于轴与时间点不对应的数据,因此没有自然顺序。因此,不同的轴布置可能是有意义的。 一、平...