艾伟_转载:趣味问题:你能用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#了……)

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

目录
相关文章
|
8月前
|
前端开发
前端学习笔记202305学习笔记第二十五天-事件对象once和event Names讲解
前端学习笔记202305学习笔记第二十五天-事件对象once和event Names讲解
37 0
|
10月前
|
JavaScript 前端开发
📕 重学JavaScript:如何实现一个`call`/`apply`?
这次要说的 call/apply 方法其实和 bind 极其类似。
59 0
|
安全 编译器 C#
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
委托(delegate) 与 事件(event) 🔥 前言🙏 在之前的文章里介绍了C#中的委托(delegate) (Action、Func、Predicate)的基本含义及用法 那本篇文章在这里还要介绍一个跟委托有很大关系的小伙伴——C#中的 事件(event)🎅 事件跟委托是有很大联系的,所以也就导致很容易分不清他们两个,以及什么时候用这两个 上面有博客提到委托,想单独了解委托的可以去看一下,本篇文章主要说一下 什么是事件 🎄 以及 事件与委托的区别🎁
C#基础知识学习之 ✨ 委托(delegate) 与 事件(event) 之间的介绍
|
JavaScript
《跟热饭一起学习vue吧》Part.6 指令带参数和修饰符
《跟热饭一起学习vue吧》Part.6 指令带参数和修饰符
|
JavaScript
分不清bind、apply、call?手写实现一下就明白了
bind、call和apply都是`Function`原型链上面的方法,因此不管是使用`function`声明的函数,还是箭头函数都可以直接调用。这三个函数在使用时都可以改变`this`指向,本文就带你看看如何实现bind、call和apply。
95 0
分不清bind、apply、call?手写实现一下就明白了
|
前端开发 JavaScript
参透JavaScript中的call和apply
对于前端工程师来说,call、apply算是常用的函数方法,允许通过函数和在函数调用中指定this的指向。那么这两个方法到底有什么区别呢?本文将详细介绍这两个方法,顺便加深对其理解。
80 0
参透JavaScript中的call和apply
|
JavaScript 前端开发 API
js基础-面试官想知道你有多理解call,apply,bind?[不看后悔系列]
函数原型链中的 apply,call 和 bind 方法是 JavaScript 中相当重要的概念,与 this 关键字密切相关,相当一部分人对它们的理解还是比较浅显,所谓js基础扎实,绕不开这些基础常用的API,这次让我们来彻底掌握它们吧! 目录 call,apply,bind的基本介绍 call/apply/bind的核心理念:借用方法 call和apply的应用场景 bind的应用场景 中高级面试题:手写call/apply、bind call,apply,bind的基本介绍 语法: fun.call(thisArg, param1, param2, ...) fun.apply(
137 0
js基础-面试官想知道你有多理解call,apply,bind?[不看后悔系列]
|
JavaScript 前端开发 Serverless
JavaScript之手撕call、apply
JavaScript之手撕call、apply
115 0
艾伟_转载:趣味问题:你能用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。
831 0
|
数据库
艾伟_转载:Entity Framework的默认值BUG解决方法
  在使用.Net 3.5里的Entity Framework开发网站的时候,遇到了一个问题:添加记录时,对于DateTime型的数据,无法使用数据库的默认值。   具体的情况是这样的,我的数据库有个Users表,三个字段,id,username,createtime。
830 0