利用特性與反射,將物件自動轉換為 SQL INSERT 語句:
public class ORMHelp
{
public void Insert(object table)
{
Type type = table.GetType();
var columValue = new Dictionary();
var sql = new StringBuilder("insert into ");
// 取得 TableAttribute 指定的資料表名
var tableAttr = (TableAttribute)type.GetCustomAttributes(false).First();
sql.Append(tableAttr.TableName).Append("(");
// 遍歷屬性,尋找 ColumAttribute
foreach (var prop in type.GetProperties())
{
foreach (var attr in prop.GetCustomAttributes(false))
{
var colum = attr as ColumAttribute;
if (colum != null)
{
var value = type.InvokeMember(prop.Name,
BindingFlags.GetProperty, null, table, null).ToString();
columValue.Add(colum.ColumName, value);
}
}
}
// 拼接欄位與值
foreach (var kv in columValue) sql.Append(kv.Key).Append(",");
sql.Remove(sql.Length - 1, 1).Append(") values('");
foreach (var kv in columValue) sql.Append(kv.Value).Append("','");
sql.Remove(sql.Length - 2, 2).Append(")");
Console.WriteLine(sql.ToString());
// 輸出範例: insert into User(userID,UserName) values('1','lfm')
}
}
static void Main()
{
var orm = new ORMHelp();
var user = new User { UserID = 1, UserName = "lfm" };
orm.Insert(user);
}
本文配套原始碼可供下載參考。