基于在运行时动态创建lambda谓词;类型

本文关键字:lambda 创建 谓词 类型 动态 运行时 基于 | 更新日期: 2023-09-27 18:18:46

我有一个ListForm<T>窗体在我的windows应用程序项目。我还将predicate字段定义为Func<Order,bool>,格式为

private Func<T,bool> predicate;

我的ListForm可以创建不同的类型,如OrderDTO, CustomerDTO, DocumentDTO,…

public class OrderDTO
{
   public string Number {get; set;}
   public string CustomerName {get; set;}
   public int Weight {get; set;}
}
public class CustomerDTO
{
   public int CustomerId {get; set;}
   public string CustomerName {get; set;}
}

是否有任何方法,我建立predicate在运行时动态与<T>类型的所有属性?(假设总是字符串必须与"X"比较,而整数必须与0比较)例如,如果ListFormOrderDTO类型创建,predicate应该是:

t=>t.Number == "X" && t.CustomerName == "X" && t.Weight == 0;

,如果它以CustomerDTO类型创建,谓词应该是

t=> t.CustomerId == 0 && t.CustomerName == "X";

我想用它来创建一个动态搜索表单。

事实上,我有一个过滤器选择窗口,用户可以在ListForm中定义他的过滤条件的数据,这个过滤器窗口动态创建,正如我在创建基于ISearchable类型的通用搜索表单

基于<T>在运行时动态创建lambda谓词;类型

中所描述的那样

按如下方式构建谓词:

private void BuildPredicate()
    {
        predicate = (obj) =>
        {
            var t = typeof(T);
            var strProps = t.GetProperties().Count(p => p.PropertyType == typeof(string) && p.GetValue(obj, null) != "X");
            var intProps = t.GetProperties().Count(p => p.PropertyType == typeof(int) && (int)p.GetValue(obj, null) != 0);
            if (strProps == 0 && intProps == 0)
            {
                return true;
            }
            return false;
        };
    }