c# - 使用各种类属性返回 Expression<>

标签 c# .net linq lambda

我有这样的东西:

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/

相关文章:

C# 使数字向上舍入产生不准确的结果

c# - 强制 Entity Framework 使用 datetime 而不是 datetime2

c# - OpenCVSharp 和 Visual Studio 2012

c# - 此代码是否被视为递归?

c# - C#中如何表示4个字节的字符

c# - 正则表达式匹配匹配字符串旁边不包含特定单词的字符串

php - 如何将此 PHP RegEx 匹配模式转换为 .Net

.net - 我可以在 Entity Framework 中进行模型级过滤吗?

C#:LINQ 中的嵌套 If else 条件

c# - 如何在 C# 中最优雅地从匿名集合创建空集合?