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