![](/img/trans.png)
[英]How to debug Expression.Lambda? (Difference in Expressions tree evaluation between .net core 2.1 and .net core 3.1)
[英]What is the difference between Member Expressions and an Expression Tree Generated by a Lambda?
這個標題可能實際上沒有任何意義,因為這些東西可能完全不同。 首先,讓我解釋一下為什么要嘗試了解這一點:
我目前正在嘗試為一種涉及很多屬性的方法編寫單元測試。 因此,我更願意編寫一個將屬性名稱列表作為其成員數據的測試,並且如果有人去更改屬性名稱,該測試將不會隨機失敗。 最初,我從字符串反射開始,但是我知道這是個壞主意,因為它沒有第二次警告。
這導致我進入以下線程和以下代碼: C#反射-不帶字符串的Get PropertyInfo
public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
return body.Member.Name;
}
這與GetValue()一起很好地工作,但是現在我試圖理解它。 我想我了解Expression類基本上是如何分解lambda表達式並從中構建一個類的,但是我試圖了解MemberExpression的真正含義,以及與它的區別是什么,它使我可以訪問類的名稱屬性。 如果我不在這里,我深表歉意。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.