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

Ado*_*rez 2 c# linq expression runtime

我有一个对象列表PolicyTran

List<PolicyTran> AllTransactions;
Run Code Online (Sandbox Code Playgroud)

我需要按属性运行查询过滤,例如:

var insureds = AllTransactions.Select(x => x.Insured).ToList();
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我需要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();
Run Code Online (Sandbox Code Playgroud)

在这种情况下propertyName包含“被保险人”或任何其他PolicyTran财产。但我收到一个编译错误,指出“类型参数无法通过用法推断...”

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

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

有任何想法吗??

Cri*_*scu 5

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

var lambda = Expression.Lambda<Func<PolicyTran, object>>(body, x).Compile();
Run Code Online (Sandbox Code Playgroud)

为了获得Func<PolicyTran, object>代表。

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