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

时间:2015-08-24 17:40:18

标签: c# lambda expression-trees

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

我目前正在尝试为触及大量属性的方法编写单元测试。因此,我更喜欢编写一个测试,该测试将属性名称列表作为其成员数据,如果有人去了并且更改了属性的名称,则不会随机启动失败。起初,我开始使用字符串反射,但我知道这是一个坏主意,因为它没有第二次警告。

这使我进入了以下主题和以下代码: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(),但现在我试图理解它。我想我明白Expression类基本上是如何拆分表达式lambda并从中构建一个类,但是我试图理解MemberExpression的真正含义以及与它的区别在于它允许我访问它的名称一个类属性。如果我在这里偏离轨道,我会道歉。

1 个答案:

答案 0 :(得分:2)

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

以下是FieldMember和PropertyMember的内容:
从LINQPad生成的屏幕截图.Dump()

enter image description here enter image description here

来源:

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;
}