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

Rob*_*Rob 5 c# lambda expression properties

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

new Column<Product>{ ColumnProperty = p => p.Title};
Run Code Online (Sandbox Code Playgroud)

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

new Column {ColumnProperty = p => p.Title};
Run Code Online (Sandbox Code Playgroud)

用这样的类:

public class Column<TModel>
{
        public Expression<Func<TModel, TProperty>> ColumnProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

List<Product> productList = GetProductsFromDb();
List<Column> columnList = new List<Column>();

columnList.Add(new Column<Product> {ColumnProperty = p => p.ProductId, Heading = "Product Id"});
columnList.Add(new Column<Product> {ColumnProperty = p => p.Title, Heading = "Title"});

Grid myGrid = new Grid(productList, columnList);
Run Code Online (Sandbox Code Playgroud)

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

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

干杯罗布

idu*_*sun 8

当你定义类似的东西Func<TModel, TProperty>意味着有一个方法采用TModel类型并返回TProperty类型.所以lambda表达式就像

p => p.ProductId 
Run Code Online (Sandbox Code Playgroud)

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

使这种语法有效的方法是定义ColumnProperty如下:

public Expression<Func<TModel, object>> ColumnProperty { get; set; }
Run Code Online (Sandbox Code Playgroud)

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