【问题标题】:How do I get the value from an anonymous expression?如何从匿名表达式中获取值?
【发布时间】:2011-07-30 06:15:26
【问题描述】:

为简单起见,想象一下以下代码:

我想创建一个 Foo:

public class Foo
{
    public string Bar { get; set; }
}

并将其传递给一个特殊的 Html Helper 方法:

Html.SomeFunction(f => f.Bar);

定义为:

public string SomeFunction<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)

我想在这个函数中获取 Bar 的值,但是完全不知道如何获取它。

【问题讨论】:

    标签: c# asp.net-mvc lambda anonymous-function


    【解决方案1】:

    只需编译表达式并获取值。

    Func<TModel, TValue> method = expression.Compile();
    
    TValue value = method(html.ViewData.Model);
    // might be a slightly different property, but you can get the ViewModel 
    // from the HtmlHelper object. 
    

    【讨论】:

    • 您的代码出现以下错误:错误 14 'System.Web.Mvc.HtmlHelper' 不包含“模型”的定义,并且没有接受“模型”的扩展方法可以找到“System.Web.Mvc.HtmlHelper”类型的第一个参数(您是否缺少 using 指令或程序集引用?)
    • 应该是html.ViewData.Model。我最初的帖子只是匆忙使用属性名称。
    【解决方案2】:

    您需要在表达式上调用 Compile() 以获取 Func,然后执行它。

    public string SomeFunction<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
    {
        TValue valueOfBar = expression.Compile()(html.Model); // Assumes Model is accessible from html.
    
        // Do stuff
    }
    

    旁注:如果不需要动态表达式或表达式分析,您不妨直接传入 Func。

    【讨论】:

    • +1 Reddog 在这里也说真话;如果实际上没有理由检查表达式,那么简单地传递 Func&lt;TModel, TValue&gt; 会好得多。
    • 不幸的是,该表达式是方法中发生的其他交互所必需的
    【解决方案3】:

    对于那些使用没有 MVT 模型的表达式的人,可以通过以下方式获取属性的名称和值。

    public static string Meth<T>(Expression<Func<T>> expression)
    {
        var name = ((MemberExpression)expression.Body).Member.Name;
        var value = expression.Compile()();
        return string.Format("{0} - {1}", name, value);
    }
    

    使用:

    Meth(() => YourObject.Property);
    

    【讨论】:

      【解决方案4】:

      使用Compile() 将使用Roslyn 编译器框架并发出MSIL 代码,该代码将动态加载到您的应用程序中。此可执行代码占用内存,与“普通”内存相比,它不受垃圾收集的影响,您也不能自己释放它。如果您过于频繁地执行此操作(例如在 SQL 生成期间定期执行此操作),您最终会耗尽内存。我遇到了这个问题,并将我的解决方案开源为一个开源库:

      https://www.nuget.org/packages/MiaPlaza.ExpressionUtils

      【讨论】:

        【解决方案5】:

        在 Microsoft.AspNetCore.Mvc.Rendering 中有有用的方法价值;

        public static string ValueFor(this IHtmlHelper htmlHelper, Expression> 表达式);

        public string SomeFunction<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression){
        var valueOfExpression = html.ValueFor(expression); 
        //do your stuff
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-26
          相关资源
          最近更新 更多