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

2 回答 2

4

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

您需要以下代码。

expression x => x.GetType().GetProperty("CustomerName")
                           .GetValue(x, null)
                           .ToString()
                           .StartsWith(comboParams.ParamValueText, true, null);
于 2012-10-12T05:14:48.070 回答
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
于 2012-10-12T05:34:07.243 回答