using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
namespace MagicStar.Entity.Attribute
{
/// <summary>
/// 將類的屬性與數據庫表中的列相關聯。
/// </summary>
[AttributeUsage(AttributeTargets.Property)]
public sealed class ColumnAttribute : System.Attribute
{
/// <summary>
/// 獲取或設置列的名稱。
/// </summary>
public string ColumnName { get; private set; }
/// <summary>
/// 獲取或設置列的標題。
/// </summary>
public string ColumnCaption { get; private set; }
/// <summary>
/// 獲取或設置列的類型。
/// </summary>
public SqlDbType ColumnType { get; private set; }
/// <summary>
/// 初始化 MagicStar.Entity.ColumnAttribute 類的壹個新實例。
/// </summary>
/// <param name="columnCaption">表或視圖的標題。</param>
/// <param name="columnName">表或視圖的名稱。</param>
/// <param name="columnType">類型。</param>
public ColumnAttribute(string columnName, string columnCaption, SqlDbType columnType)
{
ColumnName = columnName;
ColumnCaption = columnCaption;
ColumnType = columnType;
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Globalization;
using System.Collections;
using System.Data;
using MagicStar.Entity.Attribute;
using System.ComponentModel;
namespace MagicStar.Entity
{
/// <summary>
/// 實體類的基類。
/// </summary>
public abstract class EntityBase<T> where T:EntityBase<T>,new()
{
IDictionary<string, string> mColumnMapping; //列名與屬性的對應關系。
/// <summary>
/// 默認構造函數。
/// </summary>
public EntityBase()
{
mColumnMapping = new Dictionary<string, string>();
PropertyInfo[] properties = this.GetType().GetProperties();
foreach (PropertyInfo property in properties)
{
//獲取列名與屬性的對應關系。
object[] attributes = property.GetCustomAttributes(typeof(ColumnAttribute), true);
if(attributes.Length!=0)
{
ColumnAttribute attribute=(attributes[0] as ColumnAttribute);
mColumnMapping.Add(attribute.ColumnName, attribute.PropertyName);
}
}
}
/// <summary>
///
/// </summary>
/// <param name="dataTable"></param>
/// <returns></returns>
public IList<T> Parse(DataTable dataTable)
{
IList<T> list = new List<T>();
T entity;
Type entityType = this.GetType();
string propertyName;
foreach (DataRow dataRow in dataTable.Rows)
{
entity = new T();
foreach (DataColumn dataColumn in dataTable.Columns)
{
propertyName = GetPropertyName(dataColumn.ColumnName);
if (propertyName != null)
{
entityType.GetProperty(propertyName).SetValue(entity, dataRow[dataColumn], null);
}
}
list.Add(entity);
}
return list;
}
private string GetPropertyName(string columnName)
{
return this.mColumnMapping.ContainsKey(columnName) ? this.mColumnMapping[columnName] : null;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MagicStar.Entity.Attribute;
using System.Data;
using System.ComponentModel;
namespace CTest
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("dt");
dt.Rows.Add(dt.NewRow());
testentity a = new testentity();
a.Parse(dt);
Console.WriteLine(a.dt);
}
}
class testentity : MagicStar.Entity.EntityBase<testentity>
{
[ColumnAttribute("dt","日期",SqlDbType.DateTime)]
public DateTime dt { get; set; }
}
}