乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      C#反射機(jī)制詳解

       阿修羅之獅猿授 2015-12-08
      反射的定義:審查元數(shù)據(jù)并收集關(guān)於它的類型信息的能力,元數(shù)據(jù)(編輯后的基本數(shù)據(jù)單元)就是一大堆表,編譯器會(huì)創(chuàng)建一個(gè)類定義表,一個(gè)字段定義表,一個(gè)方法定義表等,System.Reflection命名空間包含的幾個(gè)類,允許你反射(解析)這些元數(shù)據(jù)的代碼

      一、反射的作用:
      動(dòng)態(tài)的創(chuàng)建類型的實(shí)例,將類型邦定到現(xiàn)有對(duì)象,或從現(xiàn)有對(duì)象中獲取類型 
      應(yīng)用程序需要在運(yùn)行時(shí)從某個(gè)特定的程序集中載入一個(gè)特定的類型,以便實(shí)現(xiàn)某個(gè)任務(wù)時(shí)可以用到反射 
      反射主要應(yīng)用於類庫(kù),這些類庫(kù)需要知道一個(gè)類型的定義,以便提供更多的功能

      二、應(yīng)用要點(diǎn):
      現(xiàn)實(shí)應(yīng)用程序中很少使用到反射 
      使用反射動(dòng)態(tài)邦定需要犧牲性能 
      有些元數(shù)據(jù)信息是不能通過(guò)反射獲取的 
      某些反射類型是專門為那些CLR開(kāi)發(fā)編輯器開(kāi)發(fā)使用的,所以你要意思到不是所有反射類型都是可以使用的

      三、取得Assembly的方法:
      Assembly.Load 
      Assembly.LoadFile 
      Assembly.LoadFrom 
      Type對(duì)象的Assembly方法

      四、反射的成員:
      MemberInfo-成員 
      ConstructorInfo-結(jié)構(gòu) 
      FieldInfo-字段 
      MethodInfo-方法 
      PropertyInfo-屬性 
      EventInfo-事件

      五、根據(jù)反射取得對(duì)象的Member信息
      private void WriteReflectionInfo()
      {
      Type testType = typeof(Test);
      Assembly assembly = testType.Assembly;
      Response.Write("Assembly:" + assembly.FullName + "<br/>");
      Type[] typeList = assembly.GetTypes();   // 獲取類型
      // 針對(duì)每個(gè)類型獲取詳細(xì)信息
      foreach (Type type in typeList)
      {
          Response.Write("------------------------" + type.Namespace + type.Name + "------------------------<br/>");
          // 獲得類型的結(jié)構(gòu)信息
          ConstructorInfo[] constructs = type.GetConstructors();

          // 獲得類型的字段信息
          FieldInfo[] fields = type.GetFields();
          Response.Write("<b>類的公共字段信息如下:</b>" + "<br/>");
          int a1 = 1;
          foreach (FieldInfo field in fields)
          {
              Response.Write((a1++).ToString() + "" + field.Name + "<br/>");
          }

          // 獲得方法信息
          MethodInfo[] methods = type.GetMethods();

          Response.Write("<b>類的公共方法如下:</b>" + "<br/>");
          int a2 = 1;
          foreach (MethodInfo method in methods)
          {
              ParameterInfo[] parameters = method.GetParameters();
              ParameterInfo reparam = method.ReturnParameter;
              Response.Write((a2++).ToString() + "" + reparam.ParameterType.Name + " " + method.Name + "(");
              int index = 0;
              foreach (ParameterInfo para in parameters)
              {
                  if (index++ < parameters.Length - 1)
                      Response.Write(para.ParameterType.Name + " " + para.Name + ",");
                  else
                      Response.Write(para.ParameterType.Name + " " + para.Name);
              }
              Response.Write(")<br/>");
          }

          // 獲得屬性的信息
          PropertyInfo[] propertys = type.GetProperties();

          Response.Write("<b>類的公共屬性如下:</b>" + "<br/>");
          int a3 = 1;
          foreach (PropertyInfo pro in propertys)
          {
              Response.Write((a3++).ToString() + "" + pro.PropertyType.Name + " " + pro.Name + "{");
              if (pro.CanRead) Response.Write("get;");
              if (pro.CanWrite) Response.Write("set;");
              Response.Write("}<br/>");
          }
          // 獲得事件信息
          EventInfo[] events = type.GetEvents();

          Response.Write("<b>類的成員如下:</b>" + "<br/>");
          // 獲得成員
          int a4 = 1;
          foreach (MemberInfo mi in type.GetMembers())
          {
              Response.Write((a4++).ToString() + "" + mi.MemberType.ToString() + " : " + mi.Name + "<br/>");
          }
      }

      六、動(dòng)態(tài)創(chuàng)建對(duì)象
      Assembly對(duì)象的 CreateInstance方法 
      Activator. CreateInstance方法 
      Type對(duì)象的 InvokeMember方法
      // 使用Assembly的CreateInstance方法來(lái)取得對(duì)象的實(shí)例
      private void Assembly_CreateInstance()
      {
          string assemblyName = "SqlModel";
          string className = assemblyName + ".Member";
          // 創(chuàng)建無(wú)參數(shù)實(shí)例
          IDAL.IMember member = (IDAL.IMember)Assembly.Load(assemblyName).CreateInstance(className);
          Response.Write("創(chuàng)建無(wú)參數(shù)實(shí)例:" + member.ID + "<br/>");
          // 創(chuàng)建有參數(shù)實(shí)例
          Object[] parameters = new Object[1];
          parameters[0] = 10000;
          IDAL.IMember member1 = (IDAL.IMember)Assembly.Load(assemblyName).CreateInstance(className, false, BindingFlags.Default, null, parameters, nullnull);
          Response.Write("創(chuàng)建有參數(shù)實(shí)例:" + member1.ID + "<br/>");
      }

      // 使用Activator的CreateInstance方法來(lái)取得對(duì)象的實(shí)例
      private void Activator_CreateInstance()
      {
          string assemblyName = "SqlModel";
          string className = assemblyName + ".Member";
          // 創(chuàng)建無(wú)參數(shù)實(shí)例
          System.Runtime.Remoting.ObjectHandle obj = Activator.CreateInstance(assemblyName, className);
          IDAL.IMember member = (IDAL.IMember)obj.Unwrap();
          Response.Write("創(chuàng)建無(wú)參數(shù)實(shí)例:" + member.ID + "<br/>");
          // 創(chuàng)建有參數(shù)實(shí)例
          Object[] parameters = new Object[1];
          parameters[0] = 10000;
          System.Runtime.Remoting.ObjectHandle obj1 = Activator.CreateInstance(assemblyName, className, false, BindingFlags.CreateInstance, null, parameters, nullnullnull);
          IDAL.IMember member1 = (IDAL.IMember)obj1.Unwrap();
          Response.Write("創(chuàng)建有參數(shù)實(shí)例:" + member1.ID + "<br/>");
      }

      // 使用Type的InvokeMember方法來(lái)取得對(duì)象的實(shí)例
      private void Type_InvokeMember()
      {
          string assemblyName = "SqlModel";
          string className = assemblyName + ".Member";
          Assembly assem = Assembly.Load(assemblyName);
          Type type = assem.GetType(className);   // 註意這里如果使用Type.GetType來(lái)取得Type的話,那麼assemblyName指定的類一定要是強(qiáng)命名的
          
      // 創(chuàng)建無(wú)參數(shù)實(shí)例
          IDAL.IMember member = (IDAL.IMember)type.InvokeMember(className, BindingFlags.CreateInstance, nullnullnull);
          Response.Write("創(chuàng)建無(wú)參數(shù)實(shí)例:" + member.ID + "<br/>");
          // 創(chuàng)建有參數(shù)實(shí)例
          Object[] parameters = new Object[1];
          parameters[0] = 10000;
          IDAL.IMember member1 = (IDAL.IMember)type.InvokeMember(className, BindingFlags.CreateInstance, nullnull, parameters);
          Response.Write("創(chuàng)建有參數(shù)實(shí)例:" + member1.ID + "<br/>");
      }

      七、動(dòng)態(tài)調(diào)用對(duì)象方法

      Type對(duì)象的 InvokeMember方法 
      MethodInfo對(duì)象的Invoke方法
      // Type對(duì)象的 InvokeMember方法來(lái)動(dòng)態(tài)調(diào)用方法
      private void InvokeMember()
      {
          string assemblyName = "SqlModel";
          string className = assemblyName + ".Member";
          string methodName = String.Empty;
          string result = String.Empty;
          Assembly assem = Assembly.Load(assemblyName);
          Object obj = assem.CreateInstance(className);
          Type type = assem.GetType(className);   // 註意這里如果使用Type.GetType來(lái)取得Type的話,那麼assemblyName指定的類一定要是強(qiáng)命名的
          
      // 動(dòng)態(tài)調(diào)用無(wú)參數(shù)的方法
          methodName = "GetName";
          result = (string)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, null);
          Response.Write(methodName + "方法的返回值:" + result + "<br/>");
          // 動(dòng)態(tài)調(diào)用有參數(shù)的方法
          methodName = "Update";
          Object[] methodParams = new Object[1];
          methodParams[0] = DateTime.Now;
          result = (string)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, methodParams);
          Response.Write(methodName + "方法的返回值:" + result + "<br/>");
          // 動(dòng)態(tài)調(diào)用參數(shù)構(gòu)架函數(shù)的帶有參數(shù)的方法
          Object[] parameters = new Object[1];
          parameters[0] = 10000;
          obj = assem.CreateInstance(className,false,BindingFlags.CreateInstance, null, parameters, nullnull);
          result = (string)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, methodParams);
          Response.Write(methodName + "方法的返回值:" + result + "<br/>");
      }

      // MethodInfo對(duì)象的Invoke方法來(lái)動(dòng)態(tài)調(diào)用方法

      private void MethodInfo_Invoke()
      {
          string assemblyName = "SqlModel";
          string className = assemblyName + ".Member";
          string methodName = String.Empty;
          string result = String.Empty;

          Assembly assem = Assembly.Load(assemblyName);
          Object obj = assem.CreateInstance(className);
          Type type = assem.GetType(className);   // 註意這里如果使用Type.GetType來(lái)取得Type的話,那麼assemblyName指定的類一定要是強(qiáng)命名的
          
      // 動(dòng)態(tài)調(diào)用無(wú)參數(shù)的方法
          methodName = "GetName";
          MethodInfo methodInfo = type.GetMethod(methodName);
          result = (string)methodInfo.Invoke(obj, null);
          Response.Write(methodName + "方法的返回值:" + result + "<br/>");
          // 動(dòng)態(tài)調(diào)用有參數(shù)的方法
          methodName = "Update";
          Object[] methodParams = new Object[1];
          methodParams[0] = DateTime.Now;
          MethodInfo method = type.GetMethod(methodName);
          result = (string)method.Invoke(obj, methodParams);
          Response.Write(methodName + "方法的返回值:" + result + "<br/>");
      }

      --------------------------------------------------------------------------------
      以上所使用的SqlModel.Member為:
      新建一個(gè)SqlModel類庫(kù),在其下建立一個(gè)Member的類

      namespace SqlModel
      {
          public class Member : IDAL.IMember
          {
              private int _id = 100;
              public int ID
              {
                  get { return _id; }
                  set { _id = value; }
              }
              private string _name = "limin";
              public string Name
              {
                  get { return _name; }
                  set { _name = value; }
              }

              public Member() { }
              public Member(int id)
              {
                  _id = id;
              }

              private void Init()
              { }

              public string GetName()
              {
                  return _name;
              }
              public string Update (DateTime cdate)
              {
                  return "{" + String.Format("ID:{0},Name:{1},CreateDate:{2}",_id,_name,cdate) + "}";
              }
          }
      }

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多