簡體   English   中英

成員表達式和Lambda生成的表達式樹之間有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM