使用linq的时候,经常需要 select new{ ...不固定的字段... } ,如何读取这些字段的单个值?通常两种做法:1)object对象反射是可以做的 2)在反射的基础上,转化为datatable 也可以
如下实例:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using ConsoleApplication1;
- using System.Data;
- using System.Collections;
- using System.Reflection;
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- /*创建数据源*/
- List<myclass> l = new List<myclass>();
- for (int i = 0; i < 10; i++)
- {
- myclass mc = new myclass();
- mc.age = i;
- mc.name = "myname" + i;
- l.Add(mc);
- }
- /*创建datatable*/
- DataTable dt = new DataTable();
- /*返回一个有任意字段的 List<Object>对象, select new 中的namefull就是自己随意添加的字段*/
- List<Object> rs = (from r in l select new { name = r.name, namefull = r.name + r.age, age = r.age }).ToList<Object>();
- /*把List<Object>对象转化为Datatable对象*/
- dt = ToDataTableTow(rs);
- /*读取Datatable对象*/
- foreach (DataRow dr in dt.Rows)
- {
- /*按照拼接的字段名称 读取内容*/
- Console.WriteLine(dr["name"].ToString() +"-----------------"+ dr["namefull"].ToString());
- }
- Console.Read();
- }
- /// <summary>
- /// 将集合类转换成DataTable
- /// </summary>
- /// <param name="list">集合</param>
- /// <returns></returns>
- public static DataTable ToDataTableTow(IList list)
- {
- DataTable result = new DataTable();
- if (list.Count > 0)
- {
- PropertyInfo[] propertys = list[0].GetType().GetProperties();
- foreach (PropertyInfo pi in propertys)
- {
- result.Columns.Add(pi.Name, pi.PropertyType);
- }
- for (int i = 0; i < list.Count; i++)
- {
- ArrayList tempList = new ArrayList();
- foreach (PropertyInfo pi in propertys)
- {
- object obj = pi.GetValue(list[i], null);
- tempList.Add(obj);
- }
- object[] array = tempList.ToArray();
- result.LoadDataRow(array, true);
- }
- }
- return result;
- }
- }
- public class myclass
- {
- public string name;
- public int age;
- }
- }