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

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

时间: 2024-07-31 02:21:18

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

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

在上一篇博客中我提出了一个问题:如何用.NET的Reflection.Emit生成等价于下面VB代码的三个类型: Class A Implements B.I End Class Class B Inherits A Interface I End Interface End Class 这个问题的难点在于三个类型有循环依赖关系:A实现了接口B.I,因此A依赖于I:B是A的子类,因此B依赖于A:接口I是B的嵌套类型,因此I依赖于B.使用Reflection.Emit的时候最大的问题就是不管以何种

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

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

艾伟_转载:WCF安全之EndPointIdentity

最近在做一个项目,应用了WCF进行分布式开发,中间还涉及到消息路由器等,好在有WCF提供了强大的基础支持,当然,本身也作了不少的扩展,实际,我 最关心的是WCF的安全问题,网上不少朋友介绍的WCF的安全也是少得可怜,微软发布的WCF Security GUID好像讲得也只是入门级别的教程,离真正应用到项目中还是有很大的距离,这也让我萌发了分享的想法,今天先放出来占个位置吧,有反对的朋友砖头轻 点,呵~,可以告诉你,WCF的安全里,有很多的小秘密,当然还是要告诉你,并且有此小秘密是要自己去体验后才

艾伟_转载:老赵谈IL(3):IL可以看到的东西,其实大都也可以用C#来发现

在上一篇文章中,我们通过一些示例谈论了IL与CLR中的一些特性.IL与C#等高级语言的作用类似,主要用于表示程序的逻辑.由于它同样了解太多CLR中的高级特性,因此它在大部分情况下依旧无法展现出比那些高级语言更多的CLR细节.因此,如果您想要通过学习IL来了解CLR,那么这个过程很可能会"事倍功半".因此,从这个角度来说,老赵并不倾向于学习IL.不过严格说来,即使IL无法看出CLR的细节,也不足以说明"IL无用"--这里说"无用"自然有些夸张.但是

艾伟_转载:WCF基本异常处理模式[中篇]

通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的错误信息仅仅限于服务端可见,并不会被WCF传递到客户端:如果将开启了IncludeExceptionDetailInFaults的ServiceDebug服务行为通过声明(通过在服务类型上应用ServiceBehaviorAttrite特性)或者配置的方式应用到相应的服务上,异常相关的所有细节信息将会原封不动地向客户端传送. 这两种方式体

艾伟_转载:C# Design Patterns (4) - Proxy

本帖介绍 Proxy Pattern (代理模式). Proxy Pattern (代理模式) The Proxy Pattern provides a surrogate or placeholder for another object to control access to it...                                  - Design Patterns: Elements of Reusable Object-Oriented Software 在 Go

艾伟_转载:数组排序方法的性能比较(上):注意事项及试验

昨天有朋友写了一篇文章,其中比较了List的Sort方法与LINQ中排序方法的性能,而最终得到的结果是"LINQ排序方法性能高于List.Sort方法".这个结果不禁让我很疑惑.因为List.Sort方法是改变容器内部元素的顺序,而LINQ排序后得到的是一个新的序列.假如两个排序方法的算法完全一致,LINQ排序也比对方多出元素复制的开销,为什么性能反而会高?如果LINQ排序的算法/实现更为优秀,那为什么.NET Fx不将List.Sort也一并优化一下呢?于是今天我也对这个问题进行了简

艾伟_转载:一个MVC分页Helper

本人写的一个分页Helper,支持普通分页(也就是,首页.上一页.下一页.末页等),综合分页(普通分页和数字分页的综合).下面是分页效果: 分页代码: PagerHelper.cs 代码   1 using System;  2  using System.Collections.Generic;  3 using System.Collections.Specialized;  4 using System.Linq;  5 using System.Web;  6 using System.

艾伟_转载:WCF版的PetShop之三:实现分布式的Membership和上下文传递

本系列文章导航 WCF版的PetShop之一:PetShop简介 WCF版的PetShop之二:模块中的层次划分 WCF版的PetShop之三:实现分布式的Membership和上下文传递 通过上一篇了解了模块内基本的层次划分之后,接下来我们来聊聊PetShop中一些基本基础功能的实现,以及一些设计.架构上的应用如何同WCF进行集成.本篇讨论两个问题:实现分布式的Membership和客户端到服务端上下文(Context)的传递. 一. 如何实现用户验证 对登录用户的验证是大部分应用所必需的,对