zoukankan      html  css  js  c++  java
  • System.Reflection.Emit 动态实现接口

     class Program
        {
            static void Main(string[] args)
            { 
                var obj = EmitHelper.ImplInterface<IPerson>();
                obj.say();
                obj.sayHi();
            }
        }
          
        public interface IPerson
        {
            void say();
            void sayHi();
        }
         
        public class EmitHelper
        {
            public static T ImplInterface<T>()
            { 
                string name = "ImplInterface";
                AssemblyName asmName = new AssemblyName(name);
                Type classType = typeof(T); 
                var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndCollect);
                var modelBuider = assemblyBuilder.DefineDynamicModule(name + ".dll"); 
                var typeBuilder = modelBuider.DefineType("impl_" + classType.Name); 
                typeBuilder.AddInterfaceImplementation(typeof(T));
    
                var methods = classType.GetMembers();
                foreach (var method in methods)
                {
                    var methodBuilder = typeBuilder.DefineMethod(method.Name, MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final, null, Type.EmptyTypes); 
                    typeBuilder.DefineMethodOverride(methodBuilder, typeof(T).GetMethod(method.Name));
                  
                    //TODO:以下是方法体的生成,还得再分析与修改
                    ILGenerator il = methodBuilder.GetILGenerator();
                    il.Emit(OpCodes.Ldstr, "接口:" + method.Name);
                    il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
                    il.Emit(OpCodes.Ret);
    
                } 
                Type objType = typeBuilder.CreateType();
                object obj = Activator.CreateInstance(objType);  
                return (T)obj;
            }
        } 
    

      

  • 相关阅读:
    1009 说反话 (20)
    1008 数组元素循环右移问题 (20)
    1007 素数对猜想(20 分)
    1006 换个格式输出整数 (15)
    PAT 1005 继续(3n+1)猜想 (25)
    PAT 1004 成绩排名 (20)
    PAT 1003 我要通过!(20)
    PAT 1002 写出这个数 (20)(20 分)
    PAT 1001 害死人不偿命的(3n+1)猜想 (15)
    人口普查(20) PAT
  • 原文地址:https://www.cnblogs.com/valeb/p/12803426.html
Copyright © 2011-2022 走看看