Skip to main content
 首页 » 编程设计

c#之如何将 DataTable 行集合反序列化为 ListT>

2024年02月03日30xing901022

几天前,我不得不将数据从 xml 文件反序列化到我的 List 类。 我的方法是这样的:

private void button1_Click(object sender, EventArgs e) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load("Test.xml"); 
    XmlSerializer xs = new XmlSerializer(typeof(UserHolder)); 
    UserHolder uh = (UserHolder)xs.Deserialize(new StringReader(doc.OuterXml)); 
    dataGridView1.DataSource = uh.Users.ToDataTable(); 
} 
public class User 
{ 
    [XmlElement("id")] 
    public Int32 Id { get; set; } 
 
    [XmlElement("name")] 
    public String Name { get; set; } 
} 
 
[XmlRoot("user_list")] 
public class UserHolder 
{ 
    private List<User> users = null; 
 
    public UserHolder() 
    { 
        users = new List<User>();  
    } 
 
    [XmlElement("user")] 
    public List<User> Users 
    { 
        get { return users; } 
        set { users = value; } 
    } 
} 
 
public static class Convert2Table 
{ 
    public static DataTable ToDataTable<T>(this IList<T> list) 
    { 
        PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); 
        DataTable table = new DataTable(); 
        for (int i = 0; i < props.Count; i++) 
        { 
            PropertyDescriptor prop = props[i]; 
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); 
        } 
        object[] values = new object[props.Count]; 
        foreach (T item in list) 
        { 
            for (int i = 0; i < values.Length; i++) 
                values[i] = props[i].GetValue(item) ?? DBNull.Value; 
            table.Rows.Add(values); 
        } 
        return table; 
    } 
} 

上面的代码工作正常,但我不得不写很多行代码。

我现在有一个新的情况,我有一个客户类和一个数据表。我的数据表中填充了多个客户数据。我想将该数据从数据表反序列化到我的客户类。我怎样才能比以前更有效地做到这一点?我怀疑 linq 会帮助我。所以请指导我将数据表数据反序列化到我的客户类列表。

请您参考如下方法:

像这样:

DataTable dt ....  
 
 
List<Customer>  customers = (from c in dt.AsEnumerable() 
                select new Customer { ID = c.Field<int>("CustomerID"),  
                Name=c.Field<string>("CustomerName")  }).ToList(); 

等等 Customer 的所有属性