如何将 lambda 运算符的权限转换为字符串

本文关键字:权限 转换 字符串 运算符 lambda | 更新日期: 2023-09-27 18:36:32

前言

我知道可以使用反射和表达式的组合来获取变量的名称。但是,在属性/字段链接的情况下,是否可以获取不仅仅是变量的名称?

示例函数

public void DisplayVarName<T>(Expression<Func<T>> expression){
    MemberExpression memberExpression = 
        expression.Body as MemberExpression;        
    Console.WriteLine(memberExpression.Member.Name);
}

例 1

string helloWorldStr = "Hello World";
DisplayVarName(() => helloWorldStr); // Outputs "helloWorldStr"

例 2

Person person = new Person(){ Name = "Santa Clause" };
DisplayVarName(() => person.Name); // Outputs "Name"

问题

有没有办法将 lambda 运算符右侧的任何内容存储在字符串中?

示例 2 将产生"person.Name",而不是简单地"Name"

如何将 lambda 运算符的权限转换为字符串

看起来最简单的方法是迭代MemberExpression.Expression

public static void DisplayVarName<T>(Expression<Func<T>> expression)
{
    List<string> memberNames = new List<string>();
    MemberExpression memberExpression = 
        expression.Body as MemberExpression;
    do
    {
        memberNames.Add(memberExpression.Member.Name);
        memberExpression = 
            memberExpression.Expression as MemberExpression;                
    } while (memberExpression != null);
    memberNames.Reverse();
    Console.WriteLine(String.Join(".", memberNames));
}

如果您只想将 lambda 的整个主体打印为字符串,则非常简单:

public void DisplayVarName<T>(Expression<Func<T>> expression){     
    Console.WriteLine(expression.Body);
}