基于在运行时动态创建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
比较)例如,如果ListForm
由OrderDTO
类型创建,predicate
应该是:
t=>t.Number == "X" && t.CustomerName == "X" && t.Weight == 0;
,如果它以CustomerDTO
类型创建,谓词应该是
t=> t.CustomerId == 0 && t.CustomerName == "X";
我想用它来创建一个动态搜索表单。
事实上,我有一个过滤器选择窗口,用户可以在ListForm
中定义他的过滤条件的数据,这个过滤器窗口动态创建,正如我在创建基于ISearchable类型的通用搜索表单
按如下方式构建谓词:
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;
};
}