Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从匿名表达式中获取值?_C#_Asp.net Mvc_Lambda_Anonymous Function - Fatal编程技术网

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

C# 如何从匿名表达式中获取值?,c#,asp.net-mvc,lambda,anonymous-function,C#,Asp.net Mvc,Lambda,Anonymous Function,为了简单起见,请想象以下代码: 我想创建一个Foo: public class Foo { public string Bar { get; set; } } 并将其传递给一个特殊的Html助手方法: Html.SomeFunction(f => f.Bar); 定义为: public string SomeFunction<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func&

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

我想创建一个Foo:

public class Foo
{
    public string Bar { get; set; }
}
并将其传递给一个特殊的Html助手方法:

Html.SomeFunction(f => f.Bar);
定义为:

public string SomeFunction<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
publicstringsomefunction(此HTMLHelperHTML,表达式)

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

您需要调用表达式上的
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
}
publicstringsomefunction(此HTMLHelperHTML,表达式)
{
TValue valueOfBar=expression.Compile()(html.Model);//假设模型可以从html访问。
//做事
}

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

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

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. 
Func method=expression.Compile();
TValue=方法(html.ViewData.Model);
//可能是一个稍有不同的属性,但您可以获得ViewModel
//从HtmlHelper对象。

对于那些使用不带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);
}
使用
Compile()。此可执行代码占用内存,与“正常”内存不同,它不接受垃圾收集,您也不能自己释放它。如果这样做太频繁(比如在SQL生成过程中经常这样做),最终会耗尽内存。我遇到了这个问题,并将我的解决方案作为开源库进行了开源:


在Microsoft.AspNetCore.Mvc.Rendering中,有方法的帮助值

公共静态字符串值(此IHtmlHelper htmlHelper,表达式)

publicstringsomefunction(此HTMLHelperHTML,表达式){
var valueOfExpression=html.ValueFor(表达式);
//做你的事
}

+1 Reddog在这里也讲真话;如果事实上没有理由检查表达式,然后简单地传递
Func
就更好了。不幸的是,该表达式对于方法中发生的其他交互是必需的。我在代码中遇到以下错误:错误14'System.Web.Mvc.HtmlHelper'不包含'Model'的定义,并且没有接受第一个类型参数的扩展方法'Model'可以找到“System.Web.Mvc.HtmlHelper”(是否缺少using指令或程序集引用?)。它应该是
html.ViewData.Model
。我最初的帖子只是匆匆忙忙地写下了酒店的名字。
Meth(() => YourObject.Property);
public string SomeFunction<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression){
var valueOfExpression = html.ValueFor(expression); 
//do your stuff
}