博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射发出 Emit
阅读量:7175 次
发布时间:2019-06-29

本文共 4637 字,大约阅读时间需要 15 分钟。

反射的主要功能是获得对象的信息、调用对象的方法等;

反射发出的主要功能是动态的创建对象。

Emit的例子

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyEmit{    public class MyClass    {        private double a = 0;        private double b = 0;        public MyClass()        {        }        public MyClass(double a,double b)        {            this.a = a;            this.b = b;        }                public double Sum()        {            return a + b;        }        public double A        {            get            {                return a;            }            set            {                a = value;            }        }    }}

下面就来看看我们如何使用代码动态构建来代替手工书写编译的过程吧:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Reflection;using System.Reflection.Emit;namespace Emit_ConsoleApplication{    class Program    {        static void Main(string[] args)        {            //构建程序集            AssemblyName aName = new AssemblyName("MyEmit");            AppDomain aDomain = AppDomain.CurrentDomain;//应用程序域,这里设为当前域            AssemblyBuilder aBuidler = aDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);            //定义模块            ModuleBuilder mBuidler = aBuidler.DefineDynamicModule("MyModule");            //创建类型(其实就是一个类)            TypeBuilder tBuidler = mBuidler.DefineType("MyEmit.MyClass", TypeAttributes.Public | TypeAttributes.Class);            //--实现类--//            //定义两个私有字段            FieldBuilder fb_a = tBuidler.DefineField("a", typeof(double), FieldAttributes.Private);            FieldBuilder fb_b = tBuidler.DefineField("b", typeof(double), FieldAttributes.Private);            //为私有变量赋值            fb_a.SetConstant((double)0);            fb_b.SetConstant((double)0);            //定义构造函数            ConstructorBuilder ctstBuilderWithoutParameters = tBuidler.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, null);//无参数构造函数            ILGenerator ctstWithoutParametersGenerator = ctstBuilderWithoutParameters.GetILGenerator();            ctstWithoutParametersGenerator.Emit(OpCodes.Ret);            ConstructorBuilder ctstBuilder = tBuidler.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, new Type[] { typeof(double), typeof(double) });            ILGenerator ctstGenerator=ctstBuilder.GetILGenerator();            ctstGenerator.Emit(OpCodes.Ldarg_0);            ctstGenerator.Emit(OpCodes.Ldarg_1);            ctstGenerator.Emit(OpCodes.Stfld, fb_a);//给字段赋值            ctstGenerator.Emit(OpCodes.Ldarg_0);            ctstGenerator.Emit(OpCodes.Ldarg_2);            ctstGenerator.Emit(OpCodes.Stfld, fb_b);                        ctstGenerator.Emit(OpCodes.Ret);            //定义属性            PropertyBuilder pro_A = tBuidler.DefineProperty("A", PropertyAttributes.None, typeof(double), null);            MethodBuilder mBuidlerGetA = tBuidler.DefineMethod("get", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, typeof(double), Type.EmptyTypes);//属性的get方法            ILGenerator getAGenerator = mBuidlerGetA.GetILGenerator();            getAGenerator.Emit(OpCodes.Ldarg_0);            getAGenerator.Emit(OpCodes.Ldfld,fb_a);            getAGenerator.Emit(OpCodes.Ret);            MethodBuilder mBuidlerSetA = tBuidler.DefineMethod("set", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new Type[]{
typeof(double)}); ILGenerator setAGenerator = mBuidlerSetA.GetILGenerator(); setAGenerator.Emit(OpCodes.Ldarg_0); setAGenerator.Emit(OpCodes.Ldarg_1); setAGenerator.Emit(OpCodes.Ldfld, fb_a); setAGenerator.Emit(OpCodes.Ret); //定义方法 MethodBuilder mtdBuidler = tBuidler.DefineMethod("Sum",MethodAttributes.Public,typeof(double),null); ILGenerator mtdGenerator = mtdBuidler.GetILGenerator(); mtdGenerator.Emit(OpCodes.Ldarg_0); mtdGenerator.Emit(OpCodes.Ldfld,fb_a); mtdGenerator.Emit(OpCodes.Ldarg_0); mtdGenerator.Emit(OpCodes.Ldfld,fb_b); mtdGenerator.Emit(OpCodes.Add); mtdGenerator.Emit(OpCodes.Ret); //创建引用、调用方法 Type MyClass = tBuidler.CreateType(); object myInstance = Activator.CreateInstance(MyClass,new object[]{
1.1,2.2});//实例化 //object result = MyClass.InvokeMember("Add", BindingFlags.InvokeMethod, null, myInstance, new object[]{1.2,2.3}); object result = MyClass.GetMethod("Sum").Invoke(myInstance,null); Console.WriteLine("this result is {0}", result.ToString()); } }}

 

 

转载地址:http://lhfzm.baihongyu.com/

你可能感兴趣的文章
Centos7 二进制安装mysql5.7
查看>>
Centos7之Nginx的两种工作模式
查看>>
Java之品优购课程讲义_day18(3)
查看>>
rpm,yum,权限
查看>>
更新yum到 163
查看>>
Office 2019 & Office 2016 下载地址
查看>>
tomcat应用转到weblogic上时的问题
查看>>
国外程序员是如何准备面试的
查看>>
Zookeeper监控之——node-zk-browser
查看>>
我的友情链接
查看>>
10个最酷的linux单行命令
查看>>
myeclipse 10 在mac retina 屏幕下显示字体模糊解决方法
查看>>
创建自定义的指令
查看>>
javascript对象中判断属性
查看>>
git删除分支与合并分支
查看>>
Python元组
查看>>
HD TUNE以及所有其他硬盘检测工具都不能使用的情况
查看>>
Linux内存分析
查看>>
vSphere 5.5 vCenter迁移至分布式交换机
查看>>
排序 遍历
查看>>