如何在运行时生成一个lambda,将属性名称作为字符串传递?

时间:2013-09-05 15:16:44

标签: c# linq runtime expression

我有一个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包含&#34;被保险人&#34;或任何其他PolicyTran财产。 但是我得到一个编译错误,说&#34;类型参数不能用ussage来推断......&#34;

我也试过了,但没有运气:

ParameterExpression x = Expression.Parameter(typeof (PolicyTran),"x");
var result = AllTransactions.Select(Expression.Lambda<Func<PolicyTran, bool>>(x).Compile()).ToList();

任何想法??

1 个答案:

答案 0 :(得分:4)

您的第一次尝试更接近解决方案。您只需要调用Lambda的通用版本:

var lambda = Expression.Lambda<Func<PolicyTran, object>>(body, x).Compile();

以获得Func<PolicyTran, object>代表。

否则labda将返回一个简单的System.Delegate,LINQ .Select无法从中推断出类型。