序列化表达式以访问字符串

问题描述

我正在研究类似于文本模板引擎的东西。
我正在从我的服务器向客户端提供元数据,以表示访问路径的 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 

有没有一种简单的方法可以像以某种方式用代码编写一样输出和表达?

解决方法

如果您需要精确地序列化/反序列化表达式树,Anas Tiour 库可能会有所帮助。

如果您想要的只是某种用于显示目的的字符串表示,那么我会推荐我编写的 Serialize.Linq 库:

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
*/

有多种可用的字符串表示形式。

(免责声明:我是后一个库的作者。)