动态lambda表达式

时间:2012-10-12 05:06:58

标签: c# entity-framework lambda

我创建了一个表达式:

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 :(

有没有办法完成这项任务。我正在使这个表达式有一个共同的实现,也许我会为此创建一个函数并接受字符串。谢谢!

2 个答案:

答案 0 :(得分:4)

您的代码存在的问题是x.GetType().GetProperty("CustomerName").Name将返回属性的名称而不是其值。

您需要以下代码。

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

答案 1 :(得分:1)

我认为问题在于GetProperty(“CustomerName”)。名称将始终返回“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