#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. В итоге я решил обойти первоначальную проблему, но эта библиотека, похоже, решит мою проблему