谁能帮我分析下面的代码中ConvertToDataTable和 ConvertToList这两个方法,看不懂,查Msdn也没搞明白。
本帖最后由 Y2012 于 2013-11-15 17:23:55 编辑
c# 反射 lambda
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication4
{
public partial class Form2 : Form
{
class Item
{
public int ID { get; set; }
public string Name { get; set; }
public double Value { get; set; }
public DateTime UpdateDateTime { get; set; }
}
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
var list = new List<Item>();
for (int i = 0; i < 20; i++)
{
list.Add(new Item()
{
ID = i,
Name = "Name of " + i.ToString(),
Value = i,
UpdateDateTime = DateTime.Now
});
}
dataGridView1.DataSource = list;
List<Item> nlist = (List<Item>)dataGridView1.DataSource;
var resultTable = ConvertToDataTable<List<Item>>(nlist);
var resultList = ConvertToList<List<Item>>(resultTable);
}
private static DataTable ConvertToDataTable<T>(T list) where T : IList
{
var table = new DataTable(typeof(T).GetGenericArguments()[0].Name);
typeof(T).GetGenericArguments()[0].GetProperties().
ToList().ForEach(p => table.Columns.Add(p.Name, p.PropertyType));
foreach (var item in list)
{
var row = table.NewRow();
item.GetType().GetProperties().
ToList().ForEach(p => row[p.Name] = p.GetValue(item, null));
table.Rows.Add(row);
}
return table;
}
private static T ConvertToList<T>(DataTable table) where T : IList, new()
{
var list = new T();
foreach (DataRow row in table.Rows)
{
var item = Activator.CreateInstance(typeof(T).GetGenericArguments()[0]);
list.GetType().GetGenericArguments()[0].GetProperties().
ToList().ForEach(p => p.SetValue(item, row[p.Name], null));
list.Add(item);
}
return list;
}
}
}