Сериализовать выражение для доступа к строке

#c# #parsing #expression #expression-trees

Вопрос:

Я работаю над чем-то похожим на механизм создания текстовых шаблонов.
Я предоставляю метаданные со своего сервера клиенту, например, для представления версии пути доступа на javascript:

Скажем, у меня есть DTO:

 public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
 

У меня есть отображение на сервере, которое выглядит так:

 Expression<Func<Employee, string>> firstNameExpression = e => employee.FirstName;
 

При возврате клиенту я хотел бы вернуть что-то подобное строковое представление выражения

 $"{nameof(Employee)}.{nameof(Employee.FirstName)}";
 

Я бы предпочел не анализировать выражение вручную или обходить дерево выражений.

 //e.g Pseudo Code

LambdaExpression expression
if(expression is MemberExpression expr)
{
   stringBuilder.Prepend(expr.Body.Member.Name)
}
//... Handle errors 
 

Существует ли простой способ вывода и выражения, как если бы он был каким-то образом написан в коде?

Ответ №1:

Если вам нужно точно сериализовать/десериализовать дерево выражений, может помочь библиотека Serialize.Linq.

Если все, что вам нужно, — это какое-то строковое представление для целей отображения, то я бы рекомендовал библиотеку ExpressionTreeToString, которую я написал:

 using ExpressionTreeToString;

Console.WriteLine(firstNameExpression.ToString("C#"));
/*
    e => e.FirstName
*/

Console.WriteLine(firstNameExpression.ToString("Textual tree", "C#"));
/*
    Lambda (Func<Employee, string>)
        · Parameters[0] - Parameter (Employee) e
        · Body - MemberAccess (string) FirstName
            · Expression - Parameter (Employee) e
*/
 

Существуют различные строковые представления.

(Отказ от ответственности: я являюсь автором последней библиотеки.)

Комментарии:

1. В итоге я решил обойти первоначальную проблему, но эта библиотека, похоже, решит мою проблему