把DataTable自动转换出Object对象集

大家好,这是我第一次在CSDN上发表我的文章, 希望得到前辈们的支持和指点。
言归正传,由于一个实例对象中包括的字段和属性很多,而每次在从数据库中取出对象时,写的类似如下的代码就会很多很多,我每次写这些代码的时候心情会很烦。

int  ID  =   int .Parse(dt.Rows[ 0 ][ " id " ].ToString());
            
string  McOK  =   int .Parse(dt.Rows[ 0 ][ " mcok " ].ToString())  ==   1   ?   true  :  false ;
            
string  Pass  =  dt.Rows[ 0 ][ " pass " ].ToString();
            
string  Sms_extend  =  dt.Rows[ 0 ][ " sms_extend " ].ToString();
            
string  UserName  =  dt.Rows[ 0 ][ " username " ].ToString();
            
string  Content_MB  =  dt.Rows[ 0 ][ " content_mb " ].ToString();


不知道你们有没有这种烦的感觉呢!为了让大家永远离开这种烦恼,我就把我的解决办法奉献出来,能给你带来帮助。

我的解决办法是通过对字段或属性添加自定义属性(System.Attribute),以及通过反射(System.Reflection;)来实现的。

首先,添加一个自定义属性类,用于修饰字段和属性,使得对象中的字段与数据库中的字段一一对应起来,没有对应到的字段或都属性就不用修饰,呵呵,代码如下:

// --->属性标记
/// <summary>
/// 对属性或字段应用属性
/// </summary>

[System.AttributeUsage(AttributeTargets.Property  |  System.AttributeTargets.Field, AllowMultiple  =   true )]
public   class  ObjectFieldAttribute : System.Attribute
{
    
public ObjectFieldAttribute(string name)
    
{
        FieldName 
= name;
    }

    
public string FieldName;//相关方法的名称
}

 

接下来添加一个MyInclude类,类里添加一个静态方法GetObject方法,用于从DataTable中自动取得对象,在这里我返回的是范型(System.Collections.Generic.List)的Object,之后可以自由转换成各类实例对象。代码如下:

 

  public   class  MyInclude
...
{
    
public MyInclude()
    ...
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
        
    }
   /**//// <summary>
    
/// 通过字段、属性和方法等的标记从DataTable返回Object对象,是范型List
    
/// </summary>
    
/// <param name="obj">需要返回的Object对象类型</param>
    
/// <param name="dt">传入的DataTable对象</param>
    
/// <returns>返回范型List</returns>

    public static Object GetObject(Type type, DataTable dt)
    ...
{
        
string methodName = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod().Name;
        
object list = MyInclude.CreateListFromType(type);
        Type listType 
= list.GetType();
        MethodInfo methodInfo 
= listType.GetMethod("Add");

        
for (int i = 0; i < dt.Rows.Count; i++)
        ...
{
            Object obj 
= Activator.CreateInstance(type);
            MemberInfo[] members 
= type.GetMembers();
            
foreach (MemberInfo member in members)
            ...
{
                Object[] objes 
= member.GetCustomAttributes(true);
                
foreach (Object obje in objes)
                ...
{
                    
if (obje.GetType() == typeof(ObjectFieldAttribute)  && member.MemberType == System.Reflection.MemberTypes.Field)
                    ...
{
                        ((FieldInfo)member).SetValue(obj, MyInclude.ConvertObject(dt.Rows[i][((ObjectFieldAttribute)obje).FieldName], ((FieldInfo)member).FieldType));
                    }

                    
if (obje.GetType() == typeof(ObjectFieldAttribute) && member.MemberType == System.Reflection.MemberTypes.Property)
                    ...
{
                        ((PropertyInfo)member).SetValue(obj, MyInclude.ConvertObject(dt.Rows[i][((ObjectFieldAttribute)obje).FieldName], ((PropertyInfo)member).PropertyType), 
null);
                    }

                }

            }

            methodInfo.Invoke(list, 
new object[] ...{ obj });
        }

        
return list;
    }


    
/// <summary>
    
/// 通过指定类型创建范型List
    
/// </summary>
    
/// <param name="type">类型参数</param>
    
/// <returns></returns>

    public static Object CreateListFromType(Type type)
    
{
        
//创建范型List<>
        string typeName= "System.Collections.Generic.List`1[[" + type.FullName + "]]";
        Type listType 
= Type.GetType(typeName);
        
return Activator.CreateInstance(listType);
    }

}
至此,要解决问题的代码已经完成,接下来,就是应用,我就添加一个类,来如何实现自动转换,类的代码如下:
using  System;
using  System.Data;
using  System.Configuration;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;
using  System.Collections.Generic;

/// <summary>
/// 客房预订信息
/// </summary>

public   class  Booking
{
    
public Booking()
    
{

    }

    
public Booking(int id)
    
{
        ID 
= id;
    }

    
/// <summary>
    
/// 自动编号
    
/// </summary>

    [ObjectField("ID")]
    
public int ID = 0;
    
/// <summary>
    
/// 客房编号
    
/// </summary>

    [ObjectField("RoomID")]
    
public int RoomID = 0;
    
/// <summary>
    
/// 入住时间
    
/// </summary>

    [ObjectField("InTime")]
    
public string InTime = string.Empty;
    
/// <summary>
    
/// 退房时间
    
/// </summary>

    [ObjectField("OutTime")]
    
public string OutTime = string.Empty;
    
/// <summary>
    
/// 您的姓名
    
/// </summary>

    [ObjectField("Name")]
    
public string Name = string.Empty;
    
/// <summary>
    
/// 性别
    
/// </summary>

    [ObjectField("Sex")]
    
public int Sex = 0;
    
/// <summary>
    
/// 证件号码
    
/// </summary>

    [ObjectField("DocumentsNum")]
    
public string DocumentsNum = string.Empty;
    
/// <summary>
    
/// 手机号码
    
/// </summary>

    [ObjectField("Mobile")]
    
public string Mobile = string.Empty;
    
/// <summary>
    
/// 电话号码
    
/// </summary>

    [ObjectField("Tel")]
    
public string Tel = string.Empty;
    
/// <summary>
    
/// 邮件地址
    
/// </summary>

    [ObjectField("Email")]
    
public string Email = string.Empty;
    
/// <summary>
    
/// 房间数
    
/// </summary>

    [ObjectField("RoomNum")]
    
public string RoomNum = string.Empty;
    
/// <summary>
    
/// 确认方式
    
/// </summary>

    [ObjectField("ConfirmWay")]
    
public int ConfirmWay = 0;
    
/// <summary>
    
/// 其它要求
    
/// </summary>

    [ObjectField("Other")]
    
public string Other = string.Empty;

    
/// <summary>
    
/// 预订者IP地址
    
/// </summary>

    [ObjectField("IP")]
    
public string IP = string.Empty;
    
/// <summary>
    
/// 预订时间
    
/// </summary>

    [ObjectField("AddTime")]
    
public DateTime AddTime = DateTime.MinValue;
    
/// <summary>
    
/// 处理结果
    
/// </summary>

    [ObjectField("Confirmed")]
    
public int Confirmed = 0;

    
/// <summary>
    
/// 备注
    
/// </summary>

    [ObjectField("Remarks")]
    
public string Remarks = string.Empty;

    
/// <summary>



    
/// <summary>
    
/// 通过ID获得预订信息
    
/// </summary>
    
/// <param name="id"></param>
    
/// <returns></returns>

    [DbAccess.SQLExecute(DbAccess.SQLExecuteType.DataTable)]
    
public static Booking GetBookingByID(int id)
    
{
        Booking booking 
= new Booking();
        booking.ID 
= id;
        DbAccess.DbAccess db 
= GetDbAccess();
        db.Sql 
= "select * from booking where id=@ID";
        
//获得DataTable
        DataTable dt = (DataTable)DbAccess.DbAccess.Execute(booking, db);

        
if (dt.Rows.Count > 0)
        
{
            
//重要方法的调用在这里
            Object obj = MyInclude.GetObject(typeof(Booking), dt);
            
if (((List<Booking>)obj).Count > 0)
            
{
                
return ((List<Booking>)obj)[0];
            }

            
//这上面没有用到任何关于dt.Rows[0][""]的这符串,呵呵,成功!
        }

        
return null;
    }



    
/// <summary>
    
/// 建立数据库连接
    
/// </summary>
    
/// <returns></returns>

    public static DbAccess.DbAccess GetDbAccess()
    
{
        
return DbBase.GetDbAccess();
    }


}


 

接下来在页面中演示:请看代码:

using  System;
using  System.Data;
using  System.Configuration;
using  System.Collections;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;
using  System.Collections.Generic;
using  System.Reflection;

public   partial   class  temp1 : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        DataTable dt 
= Booking.GetAllBooking();
        List
<Booking> list = (List<Booking>)Booking.GetObjectList(typeof(Booking), dt);
        Booking booking 
= Booking.GetBookingByID(3);
        
if (booking != null)
        
{
            Response.Write(booking.AddTime.ToString() 
+ "<br>");
            Response.Write(booking.Confirmed.ToString() 
+ "<br>");
            Response.Write(booking.ConfirmWay.ToString() 
+ "<br>");
            Response.Write(booking.DocumentsNum 
+ "<br>");
            Response.Write(booking.Email 
+ "<br>");
            Response.Write(booking.ID.ToString() 
+ "<br>");
            Response.Write(booking.InTime.ToString() 
+ "<br>");
            Response.Write(booking.IP.ToString() 
+ "<br>");
            Response.Write(booking.Mobile 
+ "<br>");
            Response.Write(booking.Name 
+ "<br>");
            Response.Write(booking.Other 
+ "<br>");
            Response.Write(booking.OutTime.ToString() 
+ "<br>");
            Response.Write(booking.Remarks 
+ "<br>");
            Response.Write(booking.RoomID.ToString() 
+ "<br>");
            Response.Write(booking.RoomNum 
+ "<br>");
            Response.Write(booking.Sex.ToString() 
+ "<br>");
            Response.Write(booking.Tel 
+ "<br>");
        }

    }

}

至此,功能全部实现,上边用到的对象中的字段或属性类型均是系统基本类型,如果其中的字段或都属性是自定义的对象,用以上的代码均能实现,在这里不多说了,大家慢慢考虑,呵呵!

不知道大家有没有理解,呵呵!如果觉得有哪些不合理的地方,请告诉我,我再改进,实际上我只是个菜鸟,还要不断得学啊!如果要交流的话,请加我QQ号:36759519,加我好友时请注明“C#.net交流”或者发我邮箱:xuejianfeng@jx0573.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值