如何从匿名表达式中获取值?
为了简单起见,想象一下以下代码:
我想创建一个 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 的值,但完全不知道如何得到它。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
只需编译表达式并获取值即可。
Simply compile the expression and get the value.
您需要对表达式调用 Compile() 来获取 Func,然后执行它。
旁注:如果不需要动态表达式或表达式分析,您不妨直接传递 Func 。
You will need to call
Compile()
on the expression to get the Func and then execute that.Side note: If there isn't any need for the dynamic expressions or expression analysis you might as well pass the Func directly in instead.
对于那些使用没有 MVT 模型的表达式的人,可以通过以下方式获取属性的名称和值。
使用:
For those that are using expression without MVT Model, one would obtain name and value of property in a following way.
use:
在 Microsoft.AspNetCore.Mvc.Rendering 中,方法有帮助价值;
public static string ValueFor(this IHtmlHelper htmlHelper, Expression>表达式);
in Microsoft.AspNetCore.Mvc.Rendering there is helpfull valuefor method;
public static string ValueFor<TModel, TResult>(this IHtmlHelper htmlHelper, Expression<Func<TModel, TResult>> expression);
使用
Compile()
将使用 Roslyn 编译器框架,并发出 MSIL 代码,该代码将动态加载到您的应用程序中。此可执行代码会占用内存,与“正常”内存相比,它不受垃圾回收的影响,您也无法自行释放它。如果您过于频繁地执行此操作(例如在 SQL 生成期间定期执行此操作),您最终将耗尽内存。我遇到了这个问题,并将我的解决方案作为开源库开源:https:// www.nuget.org/packages/MiaPlaza.ExpressionUtils
Using
Compile()
will use the Roslyn compiler-framework and will emit MSIL-code that will be dynamically loaded into your application. This executable code takes up memory, and in contrast to "normal" memory it is not subject to garbage collection nor can you free it yourself. If you do this too frequently (like regularly during SQL generation) you will run out of memory eventually. I ran into this issue and open-sourced my solutions as an open-source library:https://www.nuget.org/packages/MiaPlaza.ExpressionUtils