表达式<Func >作为对象初始化的属性?

我的表达不是很好,我想改进它们所以我想知道是否有人可以解释我是否有可能在类中创建一个属性,可以在实例化期间给出一个值,如下所示:

new Column{ ColumnProperty = p => p.Title}; 

或者更好(但我认为我在推动它)

 new Column {ColumnProperty = p => p.Title}; 

有这样的类:

 public class Column { public Expression<Func> ColumnProperty { get; set; } } 

它背后的基本思想是我从一堆像这样的Column对象创建一个Grid。

 List productList = GetProductsFromDb(); List columnList = new List(); columnList.Add(new Column {ColumnProperty = p => p.ProductId, Heading = "Product Id"}); columnList.Add(new Column {ColumnProperty = p => p.Title, Heading = "Title"}); Grid myGrid = new Grid(productList, columnList); 

这可能不是最简单/最简单的方法,但我有兴趣知道它是否可以完成,因为我想提高我对表达式的理解,我喜欢能够使用强类型值而不是字符串文字它更好跟…共事。

任何想法,想法,ramblings将不胜感激

干杯罗布

当你定义像Func这样的东西时Func它意味着有一个方法采用TModel类型并返回TProperty类型。 所以lambda表达式就像

 p => p.ProductId 

返回属性的值而不是属性本身。

要使此语法有效,您ColumnProperty按如下方式定义ColumnProperty

 public Expression> ColumnProperty { get; set; } 

然后,您可以从表达式树中提取详细信息。

好的,我只是有一个脑波,并将TProperty改为动态,我现在可以这样做,所以我想我回答了我自己的问题,但是会热衷于其他人对这种方法的优点/缺点的看法:

 foreach(Product p in productList) { var value = column.ColumnProperty.Compile().Invoke(p); } 

事实上

如果我改变我的财产

 public Func ColumnProperty { get; set; } 

我可以这样做:

 foreach(Product p in productList) { var value = column.ColumnProperty(p); }