高性能反射初体验1

 

开始认识反射 动态创建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

 

下载DEMO

posted @ 2012-04-18 16:23  苦逼面条  阅读(346)  评论(0编辑  收藏  举报