开始认识反射 动态创建View Code
1 namespace ClassLibrary1 2 3 { 4 5 public class Class1 6 7 { 8 9 public Type getmehod() 10 11 { 12 13 //动态创建程序集 namespace DynamicAssembly 14 15 AssemblyName DemoName = new AssemblyName("DynamicAssembly"); 16 17 AssemblyBuilder dynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(DemoName, AssemblyBuilderAccess.RunAndSave); 18 19 //动态创建模块 DynamicAssembly.dll 20 21 ModuleBuilder mb = dynamicAssembly.DefineDynamicModule(DemoName.Name, DemoName.Name + ".dll"); 22 23 //动态创建类MyClass public MyClass 24 25 TypeBuilder tb = mb.DefineType("MyClass", TypeAttributes.Public); 26 27 //动态创建字段 private String myField 28 29 FieldBuilder fb = tb.DefineField("myField", typeof(System.String), FieldAttributes.Private); 30 31 //动态创建构造函数 public MyClass(String text1){} 32 33 Type[] clorType = new Type[] { typeof(System.String) }; 34 35 ConstructorBuilder cb1 = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, clorType); 36 37 //生成指令 38 39 ILGenerator ilg = cb1.GetILGenerator();//生成 Microsoft 中间语言 (MSIL) 指令 40 41 ilg.Emit(OpCodes.Ldarg_0); 42 43 ilg.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes)); 44 45 ilg.Emit(OpCodes.Ldarg_0); 46 47 ilg.Emit(OpCodes.Ldarg_1); 48 49 ilg.Emit(OpCodes.Stfld, fb); 50 51 ilg.Emit(OpCodes.Ret); 52 53 //动态创建属性 54 55 PropertyBuilder pb = tb.DefineProperty("MyProperty", PropertyAttributes.HasDefault, typeof(string), null); 56 57 //动态创建方法 public string get_Field() 58 59 MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName; 60 61 MethodBuilder myMethod = tb.DefineMethod("get_Field", getSetAttr, typeof(string), Type.EmptyTypes); 62 63 //生成指令 64 65 ILGenerator numberGetIL = myMethod.GetILGenerator(); 66 67 numberGetIL.Emit(OpCodes.Ldarg_0); 68 69 numberGetIL.Emit(OpCodes.Ldfld, fb); 70 71 numberGetIL.Emit(OpCodes.Ret); 72 73 //使用动态类创建类型 74 75 Type classType = tb.CreateType(); 76 77 //保存动态创建的程序集 (程序集将保存在程序目录下调试时就在Debug下) 78 79 dynamicAssembly.Save(DemoName.Name + ".dll"); 80 81 //创建类 82 83 return classType; 84 85 } 86 87 88 89 } 90 91 92 93 } 94 95 96 97 //调用的地方 98 99 protected void Page_Load(object sender, EventArgs e) 100 101 { 102 103 ClassLibrary1.Class1 cl1 = new ClassLibrary1.Class1(); 104 105 Type ty = cl1.getmehod(); 106 107 //ty.GetType().InvokeMember("get_Field", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod, null, this, null); 108 109 //GetObjectMethod(ty, "MyClass"); 110 111 112 113 //GetObjectMethod1(ty, "get_Field"); 114 115 116 117 //动态创建的类类型 118 119 //调用有参数的构造函数 120 121 Type[] ciParamsTypes = new Type[] { typeof(string) }; 122 123 object[] ciParamsValues = new object[] { "Hello World" }; 124 125 ConstructorInfo ci = ty.GetConstructor(ciParamsTypes); 126 127 object Vector = ci.Invoke(ciParamsValues); 128 129 //调用方法 130 131 object[] methedParams = new object[] { }; 132 133 Response.Write(ty.InvokeMember("get_Field", BindingFlags.InvokeMethod, null, Vector, null)); 134 135 }
以上动态生成代码等效于下面代码View Code
1 public class MyClass 2 3 4 5 { 6 7 // Fields 8 9 private string myField; 10 11 // Methods 12 13 public MyClass(string text1) 14 15 { 16 17 this.myField = text1; 18 19 } 20 21 public string get_Field() 22 23 { 24 25 return this.myField; 26 27 } 28 29 // Properties 30 31 string MyProperty { } 32 33 34 35 }
也没有什么好讲的 这个很简单 就是简单的 "Hello World" 程序!有什么不懂可以提问简单的IL指令直接调用那些操作内存的代码我们都很难接触到.NET 貌似把我们都培养成了依附在他平台上的程序员了
求顶 2012-04-18