程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第十二講 基於反射和動態編譯的快速ORM框架(上)(9)

C#發現之旅第十二講 基於反射和動態編譯的快速ORM框架(上)(9)

編輯:關於C語言

在這段代碼中, ps是一個事先分析了DB_Employees結構而得出的System.Rection.PropertyInfo數組,包含了 所有附加了BindFieldAttribute的成員屬性,它是調用GetBindPropertIEs函數獲得的返回值 。GetDefaultValue用於獲得針對某個屬性的默認值,若調用reader.GetValue( index )獲得 了一個空值,也就是DBNull.Value則設置屬性為默認值;GetValueString是將一個數值轉換 為C#代碼的表達樣式。然後針對不同的屬性數據類型生成對應的ConvertTo代碼。

函 數GetBindPropertIEs的代碼為

private System.Reflection.PropertyInfo[]  GetBindPropertIEs( Type RecordType )
{
     if( RecordType  == null )
     {
         throw new  ArgumentNullException("ReocrdType");
     }
     if(  RecordType.IsPublic == false )
     {
         throw  new ArgumentException("類型 " + RecordType.FullName + " 不是公開類型");
     }
     if( RecordType.IsClass == false )
      {
         throw new ArgumentException("類型 " +  RecordType.FullName + " 不是類");
     }
     if(  RecordType.IsAbstract )
     {
         throw new  ArgumentException("類型 " + RecordType.FullName + " 不得是抽象類");
      }
     // 檢查是否有可用的無參數的構造函數
     //  也就是判斷語句 Record obj = new Record() 是否有效
     if(  RecordType.GetConstructor( new Type[]{}) == null )
     {
          throw new ArgumentException("類型 " + RecordType.FullName +  " 沒有默認構造函數" );
     }
      System.Collections.ArrayList propertIEs = new System.Collections.ArrayList ();
     System.Reflection.PropertyInfo[] ps =  RecordType.GetPropertIEs(
          System.Reflection.BindingFlags.Instance
         |  System.Reflection.BindingFlags.Public );
     foreach(  System.Reflection.PropertyInfo p in ps )
     {
          BindFieldAttribute fa = ( BindFIEldAttribute )  Attribute.GetCustomAttribute(
              p , typeof(  BindFIEldAttribute ));
         if( fa != null )
          {
              System.Reflection.ParameterInfo[]  PPS = p.GetIndexParameters();
              if( pps !=  null && PPS.Length > 0 )
              {
                   throw new ArgumentException("屬性 " +  RecordType.FullName + "." + p.Name + " 不得有參數");
               }
              Type pt = p.PropertyType ;
              if( pt.IsPrimitive || pt.Equals( typeof(  string )) || pt.Equals( typeof( DateTime )))
               {
              }
              else
              {
                   throw  new ArgumentException("不支持屬性 " + RecordType.FullName + "." +  p.Name + " 的數據類型 " + pt.FullName );
               }
              propertIEs.Add( p );
          }
     }

     if( propertIEs.Count == 0 )
      {
         throw new ArgumentException("類型 " +  RecordType.FullName + " 沒有標記為綁定到任何字段");
     }

     return ( System.Reflection.PropertyInfo[] ) propertIEs.ToArray(  typeof( System.Reflection.PropertyInfo ));
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved