大家都知道在C#中,如果B类继承自A类,如果一个对象是B类型的但是转换为A类型之后,这个对象是无法在调用属于B类型的方法的,如下例子:

基类A:

public class A
{
}

派生类B:

public class B : A
{
public void Test()
{
Console.WriteLine("Hello World!");
}
}

如果我们这样写:

A a = new B();
a.Test();

我们会发现编译器编译不能通过,有如下的错误:

最近看了一下《C# 从现象到本质》。这本书上写 " 通过IL实现令对象a可以调用B的方法 ",我琢磨了好久才想了一个例子,IL代码如下:

.assembly extern mscorlib
{
auto
}
.assembly MyTest {}
.module MyTest.exe
.class public A
{
.method public specialname void .ctor()
{
ldarg.
call instance void [mscorlib]System.Object::.ctor()
ret
}
}
.class public B extends A
{
.method public specialname void .ctor()
{
ldarg.
call instance void A::.ctor()
ret
} .method public void Test()
{
ldstr "helle world!"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
}
.method public static void Main()
{
.entrypoint
.locals (class A V_0)
newobj instance void B::.ctor()
stloc.
ldloc.
call instance void B::Test()
ret
}

将代码写到一个 test.il 的空文件中,然后打开 " VS2015开发人员命令提示 ",输入 " ilasm test.il ",如下:

执行成功,生成一个 "test.exe" ,在命令窗体中执行一下,如下图:

正如说书上说的IL中是可以让编译时对象执行运行时对象的方法的。

最新文章

  1. Log4j
  2. css 注意点
  3. github最简单的操作方法
  4. ES6类与模块
  5. JAVA常见错误处理方法 和 JVM内存结构
  6. crontab读取环境变量方法
  7. eclipse导入安卓工程时出现 Invalid project description. overlaps the location of another project提示
  8. Apache ab 测试工具使用(一)
  9. HDOJ2006求奇数的乘积
  10. bzoj 3784: 树上的路径 堆维护第k大
  11. POJ 2208 已知边四面体六个长度,计算体积
  12. Introduction to OOC Programming Language
  13. 【最长下降子序列的长度和个数】 poj 1952
  14. zencart的modules下数据库操作templates排版和common首页引用
  15. 【转】搭建spark环境 单机版
  16. python 获取本机的IP
  17. 我的DIY作品
  18. 05: 使用axios/vue-resource发送HTTP请求
  19. 赵炯博士《Linux内核完全注释》
  20. 【Web】Sublime Text 3 安装+注册+汉化

热门文章

  1. java之程序流程控制
  2. 利用Python进行数据分析-Pandas(第六部分-数据聚合与分组运算)
  3. Python三级菜单作业实现
  4. 使用 Polly 实现复杂策略(超时重试)
  5. PHP中RBAC权限管理
  6. 怎样使用element-starter快速搭建ElementUI项目
  7. OC-AVAudioPlayer的使用小记
  8. from __future__ import absolute_import,division,print_function的作用
  9. RDIFramework.NET ━ .NET敏捷开发框架全新发布-最好用的.NET开发框架 100%源码授权
  10. CSS绘制三角形和箭头,不用再用图片了