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