【问题标题】:How to create Expression<Func<TModel, TProperty>>;如何创建表达式<Func<TModel, TProperty>>;
【发布时间】:2013-04-25 14:25:44
【问题描述】:

如果我有一个模型对象,是否可以创建可用于不同 htmlHelpers 的Expression&lt;Func&lt;TModel, bool&gt;&gt;()(例如在CheckBoxFor()

this HtmlHelper<TModel> htmlHelper

和属性的名称(通过反射)。

【问题讨论】:

    标签: c# asp.net-mvc html-helper


    【解决方案1】:

    当然:

    static Expression<Func<TModel,TProperty>> CreateExpression<TModel,TProperty>(
        string propertyName)
    {
        var param = Expression.Parameter(typeof(TModel), "x");
        return Expression.Lambda<Func<TModel, TProperty>>(
            Expression.PropertyOrField(param, propertyName), param);
    }
    

    然后:

    var lambda = CreateExpression<SomeModel, bool>("IsAlive");
    

    【讨论】:

    • 不! Marc Gravell 不应该在这里!这是 Jon Skeet 的问题!
    • 非常感谢!简单有效!
    • 我有另一个相关的问题 - 如果我的视图中有一个更复杂的属性,一个类的实例。所以不仅仅是一个简单的字符串或布尔属性,而是一个内部具有更多属性的对象。例如,这就是我为此类“内部”属性“@Html.CheckBoxFor(m => m.Config.All)”声明简单复选框的方式。是否可以创建这样的 lambda,它会反映对象内部的属性 - “m => m.Config.All”。
    • @Anelook,你应该发布你的解决方案。
    • @ErikPhilips 参数表达式甚至不需要命名;我怀疑它只使用表达式树的.ToString() 表示的名称。显然,如果您对多个表达式使用相同的名称:预计 ToString() 会有点混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多