如何在使用 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 dll?