这个标题可能实际上没有意义,因为这些东西可能完全不同。首先,让我解释为什么我试图了解这一点:
我目前正在尝试为触及大量属性的方法编写单元测试。因此,我更喜欢编写一个测试,该测试将属性名称列表作为其成员数据,如果有人去了并且更改了属性的名称,则不会随机启动失败。起初,我开始使用字符串反射,但我知道这是一个坏主意,因为它没有第二次警告。
这使我进入了以下主题和以下代码: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的真正含义以及与它的区别在于它允许我访问它的名称一个类属性。如果我在这里偏离轨道,我会道歉。
答案 0 :(得分:2)
MemberExpression
是一个表达式,允许您访问实例的成员,字段或属性。它存储检索该成员所需的信息,例如主机类,成员名称和类型。
以下是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;
}