C#发现之旅:使用反射和特性构造自己的ORM框架(上)
2010-09-30 21:08:53 来源:WEB开发网获得对象-数据库绑定信息
框架要实现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 )
}
更多精彩
赞助商链接