zoukankan      html  css  js  c++  java
  • 动态代理 2

    下面代码,可以是基于上一篇的源码,精简出来的。方便理解

    public class MTest
        {
            public MTest()
            {
                Console.WriteLine("MTest");
            }
            public string Tt()
            {
                Console.WriteLine("tt");
                return "123";
            }
        }
        class Program
        {
    
            static void A()
            {
                Console.WriteLine("AAAAA");
            }
    
    
            static void Main(string[] argsm)
            {
                var baseType = typeof(MTest);
                TypeInfo baseTypeInfo = baseType.GetTypeInfo();
    
                var _tb = AssemblyBuilder
                    .DefineDynamicAssembly(new AssemblyName("ProxyBuilder"), AssemblyBuilderAccess.RunAndCollect)
                    .DefineDynamicModule("testmod")
                    .DefineType("name_nextId", TypeAttributes.Public, baseTypeInfo);
    
                var _fields = new List<FieldBuilder>();
                //_fields.Add(_tb.DefineField("invoke", typeof(Action<object[]>), FieldAttributes.Private));
    
                var args=_fields.Select(t => t.FieldType).ToArray();
                
    
                var  cb = _tb.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, args);
    
    
                // chained ctor call
                var baseCtor = baseTypeInfo
                    .DeclaredConstructors
                    .SingleOrDefault(c => c.IsPublic && c.GetParameters().Length == 0);
    
                ILGenerator il = cb.GetILGenerator();
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Call, baseCtor!);
    
                //// store all the fields
                for (int i = 0; i < args.Length; i++)
                {
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldarg, i + 1);
                    il.Emit(OpCodes.Stfld, _fields[i]);
                }
    
                il.Emit(OpCodes.Ret);
    
                var type=_tb.CreateTypeInfo()!.AsType();
            
                var a=Activator.CreateInstance(type) as MTest;
    
    
                Console.WriteLine("Hello World!");
    
                var mockMessaging = new MoqTest<IMessaging>(A);
                mockMessaging.Object.SendTo();
                Console.WriteLine("start..");
                return;
            }
        }
    气功波(18037675651)
  • 相关阅读:
    python中os模块和sys模块的常见用法
    Python 十进制转换为二进制 高位补零
    Invalid prop: custom validator check failed for prop "pagerCount"的报错
    Centos7 安装使用virtualenvwrapper
    如何使用CORS解决跨域问题
    内置模块
    文件操作的相关
    小数据池的概念
    set()集合的概念与一般操作
    有关于dict(字典)的特性与操作方法
  • 原文地址:https://www.cnblogs.com/qgbo/p/14029271.html
Copyright © 2011-2022 走看看