zoukankan      html  css  js  c++  java
  • 高性能反射初体验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

  • 相关阅读:
    C#24种设计模式汇总
    传智播客C++视频学习笔记(5)
    传智播客C++视频学习笔记(3)
    传智播客C++视频学习笔记(1)
    Learning hard 网络编程
    Learning hard 学习笔记
    男人和女人 访问者模式
    其实你不懂老板的心 解释器模式
    项目多也别傻做 享元模式
    git常用命令
  • 原文地址:https://www.cnblogs.com/kubimiantiao/p/2455501.html
Copyright © 2011-2022 走看看