1

前言

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

示例函数

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"

4

2 回答 2

2

看起来最简单的方法是迭代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));
}
于 2013-10-23T01:33:29.480 回答
0

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

public void DisplayVarName<T>(Expression<Func<T>> expression){     
    Console.WriteLine(expression.Body);
}
于 2013-10-23T01:21:13.787 回答