为动态类型创建包含 lambda 表达式

问题描述 投票:0回答:1

我正在尝试创建一个

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

我做错了什么以及如何解决这个问题?

c# lambda
1个回答
0
投票

我可以通过使用 Expression.Lambda 的另一个重载来解决这个问题,该重载将委托类型作为类型而不是泛型,并动态创建 Func。

所以通过改变:

 var finalExpression = Expression.Lambda<Func<dynamic, bool>>(Body, parameter);

至:

var finalExpression = Expression.Lambda(Body, parameter);

问题已解决。

© www.soinside.com 2019 - 2024. All rights reserved.