如何在运行时生成 lambda,将属性名称作为字符串传递
本文关键字:字符串 属性 运行时 lambda | 更新日期: 2023-09-27 18:30:28
我有一个PolicyTran
对象列表:
List<PolicyTran> AllTransactions;
我需要按属性运行查询过滤,例如:
var insureds = AllTransactions.Select(x => x.Insured).ToList();
这工作正常,但我需要在运行时传递 x.Insured
属性,因为该属性可以采用不同的值。
我尝试做:
ParameterExpression x = Expression.Parameter(typeof (PolicyTran),"x");
MemberExpression body = Expression.Property(x, propertyName);
var lambda = Expression.Lambda(body,x).Compile();
var result = AllTransactions.Select(lambda).ToList();
在这种情况下,propertyName
包含"被保险"或任何其他PolicyTran
财产。但是我收到一个编译错误,说"类型参数无法由ussage推断......"
我也试过了,但没有运气:
ParameterExpression x = Expression.Parameter(typeof (PolicyTran),"x");
var result = AllTransactions.Select(Expression.Lambda<Func<PolicyTran, bool>>(x).Compile()).ToList();
任何想法??
您的第一次尝试更接近解决方案。你只需要调用Lambda
的通用版本:
var lambda = Expression.Lambda<Func<PolicyTran, object>>(body, x).Compile();
为了获得Func<PolicyTran, object>
代表。
否则,labda 将返回一个简单的System.Delegate
,LINQ .Select
将无法从中推断出类型。