如何从匿名表达式中获取值?

时间:2011-04-05 19:19:37

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

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

我想创建一个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的值,但绝对不知道如何获取它。

5 个答案:

答案 0 :(得分:31)

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

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. 

答案 1 :(得分:6)

您需要在表达式上调用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。

答案 2 :(得分:0)

对于那些使用没有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);

答案 3 :(得分:0)

使用Compile()将使用Roslyn编译器框架,并将发出将动态加载到应用程序中的MSIL代码。这个可执行代码占用了内存,与#34; normal&#34;相反。内存它不受垃圾收集,也不能自己释放。如果你经常这样做(比如在SQL生成期间经常这样做),你最终会耗尽内存。我遇到了这个问题,并将我的解决方案作为一个开源库开源:

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

答案 4 :(得分:0)

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

public static string ValueFor(this IHtmlHelper htmlHelper, Expression> expression);

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