2013-09-05 26 views
1

PolicyTran对象的列表:如何在运行时将字符串的属性名称传递给lambda?

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(); 

任何想法?

回答

4

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

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

为了得到一个Func<PolicyTran, object>委托。

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

+0

工作完美,谢谢!我很接近......当它让我接受你的答案时 –

相关问题