DateTable映射到對象的字段和屬性
簡介:
作爲一個菜鳥,因該有顆不甘做菜鳥的心。這裏介紹一個C#中比較高級點的技術,反射技術。曾經有人說過當你懂了反射技術,就告別了菜鳥。這裏先介紹一個反射的有趣例子。接下幾天後來個系列講解,希望大家收看。
問題:
將dataTable中的數據映射到對象的字段和屬性。也是現在好多軟件做的關係-對象映射技術。這裏新建一個控制檯程序。
實現小例子
1、首先創建一個用於實例化對象的類
<span style="font-size:18px;">classFoo
{
publicstring Username = "";
publicint Level { get; set; }
}</span>
2、創建數據源
<span style="font-size:18px;">staticDataTable GetTable()
{
DataTable dt = newDataTable();
dt.Columns.Add("Username");
dt.Columns.Add("Level", typeof(int));
dt.Rows.Add("John", 1);
dt.Rows.Add("Cait", 2);
return dt;
}</span>
4、映射單個對象方法
<span style="font-size:18px;"> //一個實例綁定
static T BindData<T>(DataTable dt)
{
DataRow dr = dt.Rows[0];
// Get all columns'name
List<string> columns = newList<string>();
foreach (DataColumn dc in dt.Columns)
{
columns.Add(dc.ColumnName);
}
// Create object
var ob = Activator.CreateInstance<T>();
// Get all fields
var fields = typeof(T).GetFields();
foreach (var fieldInfo in fields)
{
if(columns.Contains(fieldInfo.Name))
{
//Fill the data into the field
fieldInfo.SetValue(ob, dr[fieldInfo.Name]);
}
}
// Get allproperties
var properties = typeof(T).GetProperties();
foreach (var propertyInfo in properties)
{
if(columns.Contains(propertyInfo.Name))
{
//Fill the data into the property
propertyInfo.SetValue(ob, dr[propertyInfo.Name]);
}
}
return ob;
}</span>
5、映射整個集合方法
//實例列綁定
staticList<T>BindDataList<T>(DataTable dt)
{
List<string> columns = newList<string>();
foreach (DataColumn dc in dt.Columns)
{
columns.Add(dc.ColumnName);
}
var fields = typeof(T).GetFields();
var properties = typeof(T).GetProperties()
List<T> lst = newList<T>();
foreach (DataRow dr in dt.Rows)
{
var ob = Activator.CreateInstance<T>();
foreach (var fieldInfo in fields)
{
if(columns.Contains(fieldInfo.Name))
{
fieldInfo.SetValue(ob, dr[fieldInfo.Name]);
}
}
foreach (var propertyInfo in properties)
{
if(columns.Contains(propertyInfo.Name))
{
propertyInfo.SetValue(ob, dr[propertyInfo.Name]);
}
}
lst.Add(ob);
}
return lst;
}
運行程序:
<span style="font-size:18px;">staticvoid Main(string[] args)
{
DataTable dt = GetTable();
Foo foo = BindData<Foo>(dt);
Console.WriteLine("輸出單個實體轉化");
Console.Write("名字:{0}, ",foo.Username);
Console.Write("Level:{0}",foo.Level);
Console.WriteLine();
List<Foo> lstFoo =BindDataList<Foo>(dt);
Console.WriteLine("輸出實體集合轉化");
foreach (Foo obj in lstFoo)
{
Console.Write("名字:{0}, ", obj.Username);
Console.Write("Level:{0}",obj.Level);
Console.WriteLine();
}
Console.Read();
}</span>
結論:
複雜的事情都是有很多簡單是事情組成,一點一點早日擺脫菜鳥。