成员表达式和 Lambda 生成的表达式树有什么区别?

What is the difference between Member Expressions and an Expression Tree Generated by a Lambda?

这个标题实际上可能没有意义,因为这些东西可能完全不同。首先,让我解释一下我为什么要了解这个:

我目前正在尝试为涉及很多属性的方法编写单元测试。因此,我更愿意编写一个测试,将 属性 名称列表作为其成员数据,并且如果有人去更改 属性 的名称,该测试将不会随机开始失败。起初,我从字符串反射开始,但我知道这是个坏主意,因为它没有通过第二个警告。

这使我进入了以下线程和以下代码:C# Reflection - Get PropertyInfo without a string

public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
{
    MemberExpression body = (MemberExpression)expression.Body;
    return body.Member.Name;
}

这与 GetValue() 配合使用效果很好,但现在我正试图理解它。我想我理解表达式 class 基本上是如何分解表达式 lambda 并从中构建一个 class 的,但是我试图理解 MemberExpression 的真正含义以及它的区别是什么允许我访问的名字是class属性。如果我在这里偏离轨道,我深表歉意。

a MemberExpression 是一个表达式,允许您访问实例的成员,可以是字段或 属性。它存储检索该成员所需的信息,例如主机 class、成员名称和类型。

这是 FieldMember 和 PropertyMember 的内容:
从 LINQPad .Dump().

生成的屏幕截图

来源:

void Main()
{
    GetPropertyName<Foo, string>(f => f.Bar);
    GetPropertyName<Foo, string>(f => f.bar);
}

// Define other methods and classes here
public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
{
    expression.Dump();

    MemberExpression body = (MemberExpression)expression.Body;
    return body.Member.Name;
}

public class Foo
{
    public string Bar { get; set; }
    public string bar;
}