WEB开发网
开发学院软件开发C语言 C#发现之旅:使用反射和特性构造自己的ORM框架(上... 阅读

C#发现之旅:使用反射和特性构造自己的ORM框架(上)

 2010-09-30 21:08:53 来源:WEB开发网   
核心提示: 获得对象-数据库绑定信息框架要实现ORM框架功能,第一步就是得获得应用程序对象和数据库的映射关系,C#发现之旅:使用反射和特性构造自己的ORM框架(上)(10),在MyORMFramework类型中定义了GetBindInfo函数来获得这种关系,该函数的参数是应用程序的对象类型,但不适合快速查询

获得对象-数据库绑定信息

框架要实现ORM框架功能,第一步就是得获得应用程序对象和数据库的映射关系,在MyORMFramework类型中定义了GetBindInfo函数来获得这种关系。该函数的参数是应用程序的对象类型,返回值是TableBindInfo类型,该类型就是对象-数据库映射信息。由于BindTableAttribute和BindFieldAttribute类型适合对应用对象类型做标记,但不适合快速查询信息,因此这里额外定义了TableBindInfo和FieldBindInfo类型保存映射关系,这两个类型的代码为

/// <summary>
/// 数据表绑定信息对象
/// </summary>
private class TableBindInfo
{
     /// <summary>
     /// 数据库表名
     /// </summary>
     public string TableName = null;
     /// <summary>
     /// 对象类型
     /// </summary>
     public Type ObjectType = null;
     /// <summary>
     /// 绑定信息对象
     /// </summary>
     public BindTableAttribute Attribute = null;
     /// <summary>
     /// 绑定的字段信息对象
     /// </summary>
     public FieldBindInfo[] Fields = null;
     /// <summary>
     /// 绑定的字段列表,格式为"字段1,字段2,字段3"
     /// </summary>
     public string FieldNameList = null;
}
/// <summary>
/// 数据字段绑定信息对象
/// </summary>
private class FieldBindInfo
{
     /// <summary>
     /// 绑定的字段名
     /// </summary>
     public string FieldName = null;
     /// <summary>
     /// 绑定的字段序号
     /// </summary>
     public int FieldIndex = - 1;
     /// <summary>
     /// 对象属性信息
     /// </summary>
     public System.Reflection.PropertyInfo Property = null;
     /// <summary>
     /// 数据类型
     /// </summary>
     public Type ValueType = null;
     /// <summary>
     /// 默认值
     /// </summary>
     public object DefaultValue = null;
     /// <summary>
     /// 绑定信息对象
     /// </summary>
     public BindFieldAttribute Attribute = null;
     /// <summary>
     /// 将对象数据转换为数据库中的数据
     /// </summary>
     /// <param name="v">对象数据</param>
     /// <returns>数据库数据</returns>
     public object ToDataBase( object v )
     {
         if( v == null || DBNull.Value.Equals( v ))
              return DBNull.Value ;
         string Format = Attribute.WriteFormat ;
         if( Format != null && Format.Trim().Length > 0 )
         {
              if( v is System.IFormattable )
              {
                   v = ( ( System.IFormattable ) v ).ToString( Format , null );
              }
         }
         return v ;
     }
     /// <summary>
     /// 将从数据库中获得的数据转换为对象数据
     /// </summary>
     /// <param name="v">从数据库获得的原始数据</param>
     /// <returns>转化后的对象数据</returns>
     public object FromDataBase( object v )
     {
         // 若数据为空则返回默认值
         if( v == null || DBNull.Value.Equals( v ))
              return DefaultValue ;
         // 进行格式化解析
         string Format = Attribute.ReadFormat ;
         if( Format != null && Format.Trim().Length > 0 )
         {
              string Value = Convert.ToString( v );
              if( ValueType.Equals( typeof( DateTime )))
              {
                   if( Format == null )
                       return DateTime.Parse( Value );
                   else
                       return DateTime.ParseExact( Value , Format , null );
              }
              else if( ValueType.Equals( typeof(byte )))
              {
                   return byte.Parse( Value );
              }
              else if( ValueType.Equals( typeof( short )))
              {
                   return short.Parse( Value );
              }
              else if( ValueType.Equals( typeof( int )))
              {
                   return int.Parse( Value );
              }
              else if( ValueType.Equals( typeof( float )))
              {
                   return float.Parse( Value );
              }
              else if( ValueType.Equals( typeof( double )))
              {
                   return double.Parse( Value );
              }
              return Convert.ChangeType( Value , ValueType );
         }
         if( v.GetType().Equals( ValueType ) || v.GetType().IsSubclassOf( ValueType ))
         {
              // 若数据类型匹配则直接返回数值
              return v ;
         }
         else
         {
              // 若读取的值和对象数据的类型不匹配则进行数据类型转换
              System.ComponentModel.TypeConverter converter =
                   System.ComponentModel.TypeDescriptor.GetConverter( ValueType );
              if( converter != null && converter.CanConvertFrom( v.GetType()) )
              {
                   return converter.ConvertFrom( v ) ;
              }
              return Convert.ChangeType( v , ValueType );
         }
     }//public object FromDataBase( object v )
}

上一页  5 6 7 8 9 10 

Tags:发现 之旅 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接