【问题标题】:Expression<Func<TModel,TProperty>> as Property for object initialization?Expression<Func<TModel,TProperty>> 作为对象初始化的属性?
【发布时间】:2010-11-22 10:56:14
【问题描述】:

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

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);

这可能不是最简洁/最简单的方法,但我很想知道是否可以这样做,因为我想提高对表达式的理解,并且我喜欢能够使用强类型值而不是字符串文字使用起来好多了。

任何想法、想法、漫谈将不胜感激

干杯 抢

【问题讨论】:

    标签: c# lambda properties expression


    【解决方案1】:

    当您定义类似Func&lt;TModel, TProperty&gt; 的内容时,这意味着有一个方法采用 TModel 类型并返回 TProperty 类型。所以像

    这样的 lambda 表达式
    p => p.ProductId 
    

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

    要使此语法起作用,您可以按如下方式定义您的 ColumnProperty

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

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

    【讨论】:

    • 嘿 idursun - 谢谢这也有效 - 我使用动态而不是对象,但结果是一样的
    • object 在用于原始值(例如 int)时会导致异常。在所有情况下都使用动态作品
    【解决方案2】:

    好的,所以我刚刚脑洞大开,将 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);
    }
    

    【讨论】:

    • 表达方式是一种不错的方式。我认为dynamic 需要更多开销,但可能会产生微不足道的影响。动态对象在后台维护对象成员的字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多