如何在使用 System.Linq.Dynamic.Core 构建表达式时检查 null

Posted

技术标签:

【中文标题】如何在使用 System.Linq.Dynamic.Core 构建表达式时检查 null【英文标题】:How to check for null on building expression using System.Linq.Dynamic.Core 【发布时间】:2021-08-20 10:06:36 【问题描述】:

我有一个评估表达式的方法:

static T GetFromDynamicExpression<T>(string expression, object entity) where T : class
    
        ParameterExpression itParameter = Expression.Parameter(entity.GetType());
        LambdaExpression lambdaExpression = DynamicExpression.ParseLambda(new[]  itParameter , typeof(object), expression);
        var classDelegate = lambdaExpression.Compile();
        return classDelegate.DynamicInvoke(entity) as T;
    

我有两个班级:

public class Student

    public Address Address  get; set; 


public class Address

    public string Name  get; set; 

我正在使用该方法,例如:

 var student = new Student()  ;
            string expression = "Address.Name";
            var result = GetFromDynamicExpression<string>(expression, student);

在这种情况下,它会抛出异常:

NullReferenceException:对象引用未设置为对象的实例。

这是因为学生的地址为空。现在,我希望我的表达式检查是否为空。当 Address 为 null 时,它应该返回 null(或 T 的默认值)。我该怎么做?

【问题讨论】:

【参考方案1】:

查看 GetFromDynamicExpression 方法,您似乎假设传入的实体始终是 Student。

如果是这种情况,您可以检查实体(转换为学生)并检查地址是否为空。

例子:

static T GetFromDynamicExpression<T>(string expression, object entity) where T : class
        
            ParameterExpression itParameter = Expression.Parameter(typeof(Student));

            LambdaExpression lambdaExpression = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[]  itParameter , typeof(object), expression);

            var classDelegate = lambdaExpression.Compile();

            if(entity is Student)
            
                var student = entity as Student;

                if(student.Address == null)
                
                    return null;
                
            

            return classDelegate.DynamicInvoke(entity) as T;
        

另一种不用担心类型的更短的方法是“新建” Student 类中的 Address 属性:

public class Student

   public Address Address  get; set;  = new Address();

这个结果也会返回 null。

【讨论】:

以上是关于如何在使用 System.Linq.Dynamic.Core 构建表达式时检查 null的主要内容,如果未能解决你的问题,请参考以下文章

System.Linq.Dynamic.Core - 查询嵌套对象

System.Linq.Dynamic的使用

在哪里可以找到 System.Linq.Dynamic dll?

使用Dynamic LINQ创建高级查询服务 #yyds干货盘点#

System.Linq.Dynamic

动态 linq:创建生成 JSON 结果的扩展方法