我有这样的东西:
public Expression<Func<Message, bool>> FilterData()
{
switch (this.operatorEnum)
{
case FilterParameterOperatorEnum.EqualTo:
return message => !string.IsNullOrEmpty(message.Body) &&
message.Body
.Equals(this.value, StringComparison.InvariantCultureIgnoreCase);
case FilterParameterOperatorEnum.NotEqualTo:
return message => !string.IsNullOrEmpty(message.Body) &&
!message.Body
.Equals(this.value, StringComparison.InvariantCultureIgnoreCase);
case FilterParameterOperatorEnum.Contains:
return message =>
!string.IsNullOrEmpty(message.Body) &&
message.Body.IndexOf(this.value,
StringComparison.InvariantCultureIgnoreCase) >= 0;
case FilterParameterOperatorEnum.DoesNotContain:
return message =>
!string.IsNullOrEmpty(message.Body) &&
message.Body.IndexOf(this.value,
StringComparison.InvariantCultureIgnoreCase) == -1;
}
}
如您所见,这是在 Message.Body
上完成的
我现在要对 Message
类的其他字符串属性做同样的事情,我不想重复所有这些代码。
有没有办法通过以某种方式传入属性来做到这一点?
最佳答案
将检索属性值的表达式排除在单独的 lambda 表达式中:
public Expression<Func<Message, bool>> FilterData(Func<Message, string> retrievePropValueFunc)
然后在您的过滤器表达式中,您可以调用该新的 lambda 表达式(仅举一个例子):
return message => !string.IsNullOrEmpty(retrievePropValueFunc(message))
&& retrievePropValueFunc(message)
.Equals(this.value, StringComparison.InvariantCultureIgnoreCase);
要获取 Body
属性,将 message => message.Body
传递给 retrievePropValueFunc
参数;如您所见,您可以修改它以传递不同的 lambda 表达式来检索其他属性。
关于c# - 使用各种类属性返回 Expression<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16666942/