优快云广告是越来越多了,所有博客笔记不再更新,新网址 DotNet笔记
使用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;
}
}
结果: