日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

ILGenerator.Emit動態 MSIL編程(三)之動態代理

系統 2311 0
      
        using
      
      
         System;

    
      
      
        using
      
      
         System.Linq;

    
      
      
        using
      
      
         System.Reflection;

    
      
      
        using
      
      
         System.Reflection.Emit;



    
      
      
        public
      
      
        sealed
      
      
        class
      
      
         DynamicProxy

    {

        
      
      
        private
      
      
        static
      
      
        readonly
      
      
        string
      
       AssemblyName = 
      
        "
      
      
        DynamicProxy
      
      
        "
      
      
        , 

                                       ModuleName 
      
      = 
      
        "
      
      
        DynamicProxy
      
      
        "
      
      
        , 

                                       TypeName 
      
      = 
      
        "
      
      
        DynamicProxy
      
      
        "
      
      
        ;

        
      
      
        private
      
       AssemblyBuilder CreateDynamicAssembly<T>() 
      
        where
      
       T : 
      
        class
      
      
        

        {

            
      
      
        return
      
       AppDomain.CurrentDomain.DefineDynamicAssembly(
      
        new
      
       AssemblyName(AssemblyName + 
      
        typeof
      
      
        (T).Name),

                AssemblyBuilderAccess.Run);

        }

        
      
      
        private
      
       ModuleBuilder CreateDynamicModule<T>() 
      
        where
      
       T : 
      
        class
      
      
        

        {

            
      
      
        return
      
       CreateDynamicAssembly<T>().DefineDynamicModule(ModuleName + 
      
        typeof
      
      
        (T).Name);

        }

        
      
      
        ///
      
      
        <summary>
      
      
        ///
      
      
         創建動態代理

        
      
      
        ///
      
      
        </summary>
      
      
        public
      
       T CreateDynamicType<T>() 
      
        where
      
       T : 
      
        class
      
      ,
      
        new
      
      
        ()

        {

            TypeBuilder typeBuilder 
      
      = CreateDynamicModule<T>().DefineType(TypeName + 
      
        typeof
      
      (T).Name, TypeAttributes.Public |
      
         

                TypeAttributes.Class, 
      
      
        typeof
      
      
        (T));

            TypeActuator
      
      <T>
      
        (typeBuilder);

            
      
      
        return
      
       Activator.CreateInstance(typeBuilder.CreateType()) 
      
        as
      
      
         T;

        }

        
      
      
        private
      
      
        void
      
      
         BuildCtorMethod(Type classType, FieldBuilder fieldBuilder, TypeBuilder typeBuilder)

        {

            
      
      
        var
      
       structureBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard,
      
        null
      
      
        );

            
      
      
        var
      
       ilCtor =
      
         structureBuilder.GetILGenerator();

            ilCtor.Emit(OpCodes.Ldarg_0);

            ilCtor.Emit(OpCodes.Newobj, classType.GetConstructor(Type.EmptyTypes));

            ilCtor.Emit(OpCodes.Stfld, fieldBuilder);

            ilCtor.Emit(OpCodes.Ret);

        }

        
      
      
        private
      
      
        void
      
      
         BuildMethod(ILGenerator il, MethodInfo methodInfo, Type[] ParameterTypes)

        {

            il.Emit(OpCodes.Ldarg_0);

            
      
      
        for
      
       (
      
        int
      
       i = 
      
        0
      
      ; i < ParameterTypes.Length; i++
      
        )

                il.Emit(OpCodes.Ldarg_S, (
      
      
        short
      
      )(i + 
      
        1
      
      
        ));

            il.Emit(OpCodes.Call, methodInfo);

            il.Emit(OpCodes.Ret);

        }

        
      
      
        private
      
      
        void
      
       TypeActuator<T>(TypeBuilder builder) 
      
        where
      
       T : 
      
        class
      
      
        

        {

            FieldBuilder fieldBuilder 
      
      = builder.DefineField(
      
        "
      
      
        _DynamicProxyActuator
      
      
        "
      
      , 
      
        typeof
      
      
        (T), FieldAttributes.Private);

            BuildCtorMethod(
      
      
        typeof
      
      
        (T), fieldBuilder, builder);

            MethodInfo[] info 
      
      = GetMethodInfo(
      
        typeof
      
      
        (T));

            
      
      
        foreach
      
       (MethodInfo methodInfo 
      
        in
      
      
         info)

            {

                
      
      
        if
      
       (!methodInfo.IsVirtual && !methodInfo.IsAbstract) 
      
        continue
      
      
        ;

                
      
      
        if
      
       (methodInfo.Name == 
      
        "
      
      
        ToString
      
      
        "
      
      ) 
      
        continue
      
      
        ;

                
      
      
        if
      
       (methodInfo.Name == 
      
        "
      
      
        GetHashCode
      
      
        "
      
      ) 
      
        continue
      
      
        ;

                
      
      
        if
      
       (methodInfo.Name == 
      
        "
      
      
        Equals
      
      
        "
      
      ) 
      
        continue
      
      
        ;

                
      
      
        var
      
       ParameterTypes = methodInfo.GetParameters().Select(p =>
      
         p.ParameterType).ToArray();

                MethodBuilder methodBuilder 
      
      = CreateMethod(builder, methodInfo.Name, MethodAttributes.Public |
      
         MethodAttributes.Virtual,

                    CallingConventions.Standard, methodInfo.ReturnType, ParameterTypes);

                
      
      
        var
      
       ilMethod =
      
         methodBuilder.GetILGenerator();

                BuildMethod(ilMethod, methodInfo, ParameterTypes);

            }

        }

        
      
      
        private
      
       MethodBuilder CreateMethod(TypeBuilder typeBuilder, 
      
        string
      
      
         name, MethodAttributes attrs, CallingConventions callingConventions, 

            Type type, Type[] parameterTypes)

        {

            
      
      
        return
      
      
         typeBuilder.DefineMethod(name, attrs, callingConventions, type, parameterTypes);

        }

        
      
      
        private
      
      
         MethodInfo[] GetMethodInfo(Type type)

        {

            
      
      
        return
      
       type.GetMethods(BindingFlags.Public |
      
         BindingFlags.Instance);

        }

    }
      
    

?

ILGenerator.Emit動態 MSIL編程(三)之動態代理


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 蓬莱市| 凌海市| 津南区| 车险| 呼伦贝尔市| 且末县| 石泉县| 大连市| 潮安县| 武冈市| 扎囊县| 定远县| 乐东| 如东县| 江油市| 二连浩特市| 彩票| 仙居县| 醴陵市| 攀枝花市| 承德市| 沛县| 高唐县| 原阳县| 仪陇县| 泽库县| 五原县| 闻喜县| 洪洞县| 琼中| 南开区| 青海省| 定西市| 元朗区| 江华| 红河县| 安徽省| 邮箱| 鹤峰县| 临漳县| 荃湾区|