zoukankan      html  css  js  c++  java
  • C#A类派生类强转基类IL居然还是可以调用派生类中方法的例子

    大家都知道在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.0
            call instance void [mscorlib]System.Object::.ctor()
            ret
        }
    }
    .class public B extends A
    {
        .method public specialname void .ctor()
        {
            ldarg.0
            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.0
        ldloc.0
        call instance void B::Test()
        ret
    }

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

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

     

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

  • 相关阅读:
    BlockingQueue 原理 分析
    java引用 强引用,软引用,弱引用
    actomic cas无锁操作。
    MongoDB库设计原则及实践
    spring事物传播机制 事物隔离级别
    Hive UDAF介绍与开发
    [技术学习]js接口继承
    [技术学习]js继承
    [技术学习]正则表达式分析
    [技术学习]js正则表达式汇总
  • 原文地址:https://www.cnblogs.com/Jeffrey-Chou/p/11914703.html
Copyright © 2011-2022 走看看