using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DataTableTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
List<Person> people = new List<Person>()
{
new Person(){ Name="张三", Age=20, Gender=true, Address="中山路1号"},
new Person(){ Name="李四", Age=32, Gender=true, Address="黄埔路1号"},
new Person(){ Name="王五", Age=25, Gender=true, Address="天河路1号"},
new Person(){ Name="赵六", Age=28, Gender=true, Address="荔湾路1号"},
};
dataGridView1.DataSource = CustomDataTable(people, p => p.Name, p => p.Age, /*p => p.Gender,*/ p => p.Address);
}
//此处参数如果传的是Func,那就无法用反射解析出内部的Member,这就是Expression优于Func之处
private DataTable CustomDataTable<T>(List<T> datas, params Expression<Func<T,object>>[] columns)
{
DataTable dt = new DataTable();
string[] colName = new string[columns.Length];
int cnt = 0;
foreach (var col in columns)
{
MemberExpression prop;
if (col.Body is UnaryExpression ue && ue.NodeType == ExpressionType.Convert)
{
prop = ue.Operand as MemberExpression;
}
else
{
prop = col.Body as MemberExpression;
}
colName[cnt++] = prop.Member.Name;
string attrVal = (prop.Member.GetCustomAttributes(typeof(DescriptionAttribute),false)[0] as DescriptionAttribute).Description;
dt.Columns.Add(new DataColumn(attrVal));
}
foreach (var item in datas)
{
var row = dt.Rows.Add();
for (int i = 0; i < colName.Length; i++)
{
row[i] = item.GetType().GetProperty(colName[i]).GetValue(item).ToString();
}
}
return dt;
}
}
public class Person
{
[Description("姓名")]
public string Name { get; set; }
[Description("年龄")]
public double Age { get; set; }
[Description("性别")]
public bool Gender { get; set; }
[Description("地址")]
public string Address { get; set; }
}
}
Expression与Func的区别(Expression与反射的结合使用,生成自定义报表)
于 2022-09-16 11:55:13 首次发布
该博客介绍了如何利用C#中的Expression泛型方法来创建DataTable,通过示例展示了将带有Description属性的Person对象列表转换为DataTable的过程,强调了Expression相对于Func在反射解析上的优势。
摘要由CSDN通过智能技术生成