c# - 在 C# 中制作泛型表达式生成方法

标签 c# reflection lambda

我正在使用多种方法构建 IQueryable 查询。这些方法有些复杂,但我想解决的问题可以提取和简化如下。我有两种方法

private Expression<Func<T, bool>> CreateExpressionA(string ValueA)
{
  return a => a.PropertyA.ToLower() == ValueA;
}

private Expression<Func<T, bool>> CreateExpressionB(string ValueB)
{
  return a => a.PropertyB.ToLower() == ValueB;
}

我宁愿拥有的是:

private Expression<Func<T, bool>> CreateExpression(??? Selector, string Value)
{
  return a => a.Selector.ToLower() == Value;
}

或类似的方法,可以让我避免使用两个相同的方法,唯一的区别在于在那里使用了对象的什么属性。

有没有可能以某种优雅的方式做到这一点?

最佳答案

您可以传入一个选择器 Func,它返回一个 string 属性:

private Expression<Func<T, bool>> CreateExpression<T>(Func<T, string> selector, string value)
{
    return a => selector(a).ToLower() == value;
}

用法:

CreateExpression<MyType>(x => x.PropertyA, "thevalue");

关于c# - 在 C# 中制作泛型表达式生成方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40590451/

相关文章:

java - 在 Java 8 中将 Map 中的值转换为 List<Serialized>

c# - WPF 中 GridViewDataColumn.CellEditTemplate 上的 MVVM 嵌套绑定(bind)

c# - asp.net core http delete `FromBody` 如果没有内容类型 header 则忽略

java - 使用Java时如何在不使用try-catch的情况下忽略可能的ClassNotFoundException

c# - C#中如何通过反射获取属性值

c# - 如何向初始化的表达式树添加新成员?

c# - TransactionScope 在用于数据库单元测试时导致 TransactionManagerCommunicationException

c# - Windows 窗体分隔符控件

C# 反射 - 递归类型参数的 MakeGenericType

C# 在注入(inject)第一个参数的给定方法上创建 lambda