zoukankan      html  css  js  c++  java
  • c# emit 动态实现接口

    using System;
    using System.Linq;
    using System.Reflection;
    using System.Reflection.Emit;
    
    
    namespace TestEmit{
    
       public interface IPerson{
            void SayHello();
        
        }
    
       class Person2 {
           public void SayHello() {
    
               Console.WriteLine("i am person2");
           }
       }
    
        class Test2
        {
            static void Main(string[] args)
            {
                IPerson p = (IPerson)CreateType();
                p.SayHello();
    
     
                Console.ReadLine();
            }
    
    
    
            public static object CreateType()
            {
                AssemblyName assemblyName = new AssemblyName("assemblyName");
                AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
                ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
                TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
                //*添加所实现的接口
                typeBuilder.AddInterfaceImplementation(typeof(IPerson));
    
              //实现方法
                MethodBuilder mbIM = typeBuilder.DefineMethod("SayHello",
               MethodAttributes.Public | MethodAttributes.HideBySig |
                   MethodAttributes.NewSlot | MethodAttributes.Virtual |
                   MethodAttributes.Final,
               null,
               Type.EmptyTypes);
           
                ILGenerator il = mbIM.GetILGenerator();
                il.Emit(OpCodes.Ldstr, "The SayHello implementation of IPerson");
                il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
                    new Type[] { typeof(string) }));
                il.Emit(OpCodes.Ret);
                typeBuilder.DefineMethodOverride(mbIM, typeof(IPerson).GetMethod("SayHello"));
     //添加方法
                //MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, null, null);
         
    
                //ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
                //ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈");
                //ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
                //ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
                ////没有返回值所有加OpCodes.Pop
                //ilOfSayHello.Emit(OpCodes.Pop);
                //ilOfSayHello.Emit(OpCodes.Ret);
                Type personType = typeBuilder.CreateType();
                assemblyBuilder.Save("Person.dll");
                object obj = Activator.CreateInstance(personType);
                MethodInfo methodInfo = personType.GetMethod("SayHello");
                
                methodInfo.Invoke(obj, null);
                return Activator.CreateInstance(personType);
            }
    
        }
    
    
     
    }
  • 相关阅读:
    【洛谷P2967】【USACO 2009 Dec】电子游戏 Video Game Troubles
    2021-09-11 刷题 39. 组合总和
    2021-09-10 刷题 160. 相交链表
    2021-09-09 刷题 141. 环形链表
    2021-09-08 刷题 20. 有效的括号
    2021-09-07 刷题 119杨辉三角2
    2021-08-01 刷题 合并两个有序链表
    2021-07-31 leetcode刷题记录 两数之和
    根据需要数据库的内容,封装增删改查的sql函数
    QT 对XML 文件进行增删改查
  • 原文地址:https://www.cnblogs.com/tiancai/p/8283182.html
Copyright © 2011-2022 走看看