【问题标题】:How to check for null on building expression using System.Linq.Dynamic.Core如何在使用 System.Linq.Dynamic.Core 构建表达式时检查 null
【发布时间】: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 的默认值)。我该怎么做?

【问题讨论】:

    标签: c# linq lambda dynamic


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多