反射的主要功能是获得对象的信息、调用对象的方法等;
反射发出的主要功能是动态的创建对象。
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()); } }}