为简单起见,请想象以下代码:
我想创建一个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的值,但绝对不知道如何获取它。
答案 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生成期间经常这样做),你最终会耗尽内存。我遇到了这个问题,并将我的解决方案作为一个开源库开源:
答案 4 :(得分:0)
在 Microsoft.AspNetCore.Mvc.Rendering 中有有用的方法值;
public static string ValueFor
public string SomeFunction<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression){
var valueOfExpression = html.ValueFor(expression);
//do your stuff
}