【发布时间】:2013-12-29 03:53:06
【问题描述】:
我正在使用 VS2010 和 EF4.0。目标是选择任何 IEnumerable 的字段,以便在 DataGridView 中显示。以Northwind.Employees为例,如下代码即可。
private void button1_Click(object sender, EventArgs e)
{
NorthwindEntities en = new NorthwindEntities();
dataGridView1.DataSource = SelectNew(en.Employees, new string[] { "EmployeeID", "FirstName" });
}
public object SelectNew(object items, string[] fields)
{
IEnumerable<Employee> ems = items as IEnumerable<Employee>;
return ems.Select(em => new
{
id = em.EmployeeID,
name = em.FirstName
}
).ToArray();
}
参数object items为IEnumerable of EntityObject,该函数将在客户端内存中执行,现在与数据库无关。
但是我直到运行时才知道 EntityObject 类型(Employee),所以可能会用到一些复杂的反射。
我检查了this,
但是当我将结果绑定到控件时,它只显示没有任何列或数据的空白行。并且功能是for IQueryable,我试过IEnumerable.AsQueryable并传递给它,但结果也没有显示任何列。
【问题讨论】:
-
您也许可以修改
GetAccessExpression()的方法GetAccessExpression()这是我的旧答案 stackoverflow.com/a/17772023/425871 反射并不是很难找到指定为字符串的属性(就像在您的示例中一样) 在您不知道其类型的对象上,甚至递归地执行它(因此您可以访问属性的属性)。该方法返回一个Expression对象来访问该属性,但它可以改为返回该属性的值。 -
@Steve 谢谢,但是 private static Expression GetAccessExpression(Expression param, string property, Type type) 这个函数和我想要的太不一样了。我无法将其转换为公共对象 SelectNew(对象项,字符串 [] 字段)。有什么想法吗?
标签: c# linq reflection datagridview expression