Как @ Html.TextBoxFor узнает, что я имею в виду свойство модели, а не значение, возвращаемое свойством? - PullRequest
0 голосов
/ 26 октября 2019

Обычно в lamda выражение, такое как (x => x.FirstName), lamda возвращает значение «FirstName» (предположительно строка), но некоторые как @Html.TextBoxFor(x => x.FirstName) знают, что я имею в виду свойство «FirstName», а не возвращаемое значениепо имениКакой метод C # или компилятор используется для достижения этой цели? Я попытался прочитать исходный код MVC, но он прошел через мою голову.

1 Ответ

0 голосов
/ 26 октября 2019

Expression - это просто объект, представляющий то, что содержится в лямбда-выражении. Его можно осмотреть, как и любой другой объект. Вы можете думать об этом как о сложном виде Reflection, и, действительно, вы можете получить такие вещи, как Type и PropertyInfo для всего, что находится внутри него, если вы знаете, как его анализировать.

Этот пример демонстрирует, какпростое выражение типа m => m.FirstName может быть проанализировано, чтобы выяснить, на какое свойство ссылаются:

public class MyModel
{
    public string FirstName { get { return "John Jacob Jingleheimer Schmidt"; } }
}

public class Program
{
    public static void Main()
    {
        var model = new MyModel();
        var result = Test(m => m.FirstName, model);

        Console.WriteLine(result);
    }

    public static TOut Test<TIn, TOut>(Expression<Func<TIn, TOut>> expression, TIn instance) where TOut: class
    {
        MemberExpression memberExpression = (MemberExpression)expression.Body;
        var member = memberExpression.Member;

        Console.WriteLine("The expression is a reference to '{0}.{1}'", member.DeclaringType.FullName, member.Name);

        var compiled = expression.Compile();
        var result = compiled(instance) as TOut;
        return result;
    }
}

Выход:

The expression is a reference to 'Example.MyModel.FirstName'
John Jacob Jingleheimer Schmidt

Ссылка на демонстрацию DotNetFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...