表達

2012-10-12 30 views
0

我創建像一個表達式動態拉姆達:表達

expression = x => x.CustomerName.StartsWith(comboParams.ParamValueText, true, null); 

我想訪問客戶名稱作爲一般是這樣的:

expression = x => x["CustomerName"] and access the StartsWith function 

我已經嘗試過的代碼,如

expression x => x.GetType().GetProperty("CustomerName").Name.StartsWith(comboParams.ParamValueText, true, null); --> it doesn't seem to work :(

有沒有辦法完成這個任務。我使這個表達式有一個通用的實現,也許我會爲此創建一個函數並接受字符串。謝謝!

回答

4

你的代碼的問題是,x.GetType().GetProperty("CustomerName").Name將返回屬性的名稱而不是它的值。

您需要以下代碼。

expression x => x.GetType().GetProperty("CustomerName") 
          .GetValue(x, null) 
          .ToString() 
          .StartsWith(comboParams.ParamValueText, true, null); 
+0

是的,我同意你的答案是正確的,比我更簡潔。 – David

+0

謝謝!有效 :) –

1

我認爲問題在於GetProperty(「CustomerName」)。Name將始終返回「CustomerName」,即它是屬性的名稱。

嘗試這樣的事情,而不是(我重構有點是一個獨立的例子):

class Customer { public string CustomerName { get; set; } } 
var customer = new Customer { CustomerName = "bob" }; 
Expression<Func<Customer, string, bool>> expression = (c, s) => c.GetType().GetProperty("CustomerName").GetGetMethod().Invoke(c, null).ToString().StartsWith(s, true, null); 

var startsResult = expression.Compile()(customer, "b"); // returns true 
startsResult = expression.Compile()(customer, "x"); // returns false