我正在尝试创建一个
Contains
过滤器LambdaExpression
。
类的类型将在运行时被识别并存储在 Type
变量中,如下所示:
Type ModelClassType; //type of the class is assigned at runtime to this variable
我试图创建的表达式是:
x => AwaitingTasksIDs.Contains(x.WfmTaskID.Value)
但是由于
WfmTaskID
可以为空,并且为了简单起见,我尝试按如下方式创建 lambda:
var propertyName = "WfmTaskID";
var methodInfo = typeof(List<Guid?>).GetMethod("Contains", new Type[] { typeof(Guid?) });
var parameter = Expression.Parameter(ModelClassType);//ModelClassType is a Type variable and is set at runtime dynamically
var member = Expression.Property(parameter, propertyName);
var constant = Expression.Constant(AwaitingTasksIDs);
Expression Body = Expression.Call(Expression.Constant(AwaitingTasksIDs), methodInfo, member);
var finalExpression = Expression.Lambda<Func<dynamic, bool>>(Body, parameter);
最后一行代码:
var finalExpression = Expression.Lambda<Func<dynamic, bool>>(Body, parameter);
我在运行时收到以下错误消息:
ParameterExpression of type 'Kar.Model.Infrastructure.ProjectType' cannot be used for delegate parameter of type 'System.Object
我做错了什么以及如何解决这个问题?
我可以通过使用 Expression.Lambda 的另一个重载来解决这个问题,该重载将委托类型作为类型而不是泛型,并动态创建 Func。
所以通过改变:
var finalExpression = Expression.Lambda<Func<dynamic, bool>>(Body, parameter);
至:
var finalExpression = Expression.Lambda(Body, parameter);
问题已解决。