表达<FUNC <tModel的,tproperty>&GT;作为对象初始化的属性?</func <tmodel,tproperty>

时间:2010-11-22 10:56:15

标签: c# lambda properties expression

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

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

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

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

有类似这样的课程:

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

它背后的基本思想是我从一堆像这样的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);

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

任何想法,想法和任何想法都会受到高度赞赏

干杯 罗布

2 个答案:

答案 0 :(得分:8)

当您定义Func<TModel, TProperty>之类的内容时,意味着有一种方法采用TModel类型并返回TProperty类型。所以lambda表达式如

p => p.ProductId 

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

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

public Expression<Func<TModel, object>> ColumnProperty { get; set; }

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

答案 1 :(得分:1)

好的,所以我只是脑波,并将TProperty变为动态,我现在可以这样做,所以我想我回答了我自己的问题,但是会热衷于其他人对这种方法的利弊的想法:

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

实际上

如果我将我的财产改为

public Func<TModel, dynamic> ColumnProperty { get; set; }

我可以这样做:

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