Как я могу получить значение от анонимного выражения? - PullRequest
18 голосов
/ 05 апреля 2011

Для простоты представьте следующий код:

Я хочу создать 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 внутри этой функции, но совершенно не знаю, как его получить.

Ответы [ 4 ]

32 голосов
/ 05 апреля 2011

Просто скомпилируйте выражение и получите значение.

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. 
6 голосов
/ 05 апреля 2011

Вам нужно будет вызвать 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
}

Примечание: если в динамических выражениях или анализе выражений нет необходимости, вы можете вместо этого передать функцию напрямую.

1 голос
/ 07 октября 2015

Для тех, кто использует выражение без модели 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);
0 голосов
/ 09 мая 2017

Использование Compile() будет использовать платформу компилятора Roslyn и будет генерировать MSIL-код, который будет динамически загружаться в ваше приложение.Этот исполняемый код занимает память, и, в отличие от «нормальной» памяти, он не подлежит сборке мусора, и вы не можете освободить его самостоятельно.Если вы делаете это слишком часто (например, регулярно во время генерации SQL), у вас в конце концов не хватит памяти.Я столкнулся с этой проблемой и открыл свои решения в виде библиотеки с открытым исходным кодом:

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

...