Lambda 表达式检查是否为 null helper

Lambda expression check if null helper

我希望能够写作

 MyObject.IsNull(p => p.MyObjectProperty)

我觉得用表情是可以实现的。 我希望以这种方式实现它:

public static void IsNull<T>(this T root, Expression<Func<T, object>> expression)
{
    if (CheckIfNull<T>(expression))
    {
        throw new ArgumentNullException(GetName(expression));
    }
}

private static string GetName<T>(Expression<Func<T, object>> expression)
{
    return ((MemberExpression)expression.Body).Member.Name;
}

public static bool CheckIfNull<T>(Expression<Func<T, object>> expression)
{
    Expression<Func<T, object>> obj = o => expression.Compile().Invoke(o);
    return obj == null;
}

但是接缝处不行。 我该如何解决?

你有一个错误:

比较 obj == null 应该是 obj(root) == null - 当然你必须将 root 作为参数传递给 CheckIfNull

前一个比较的计算结果总是 false,因为您实际上是在比较 o => expression.Compile().Invoke(o)null - 它们永远不相等。您宁愿将调用 Invoke 结果 null.

进行比较

我所有的建议加在一起:

public static bool CheckIfNull<T>(this T root, Expression<Func<T, object>> expression)
{
    return expression.Compile()(root) == null;
}

public static void IsNull<T>(this T root, Expression<Func<T, object>> expression)
{
    if (root.CheckIfNull<T>(expression))
    {
        throw new ArgumentNullException(GetName(expression));
    }
}

private static string GetName<T>(Expression<Func<T, object>> expression)
{
    return ((MemberExpression)expression.Body).Member.Name;
}

进一步评论:

  • 我不确定 ArgumentNullException 是否适合这种情况。但是,如果不了解您的情况,就很难提出更好的建议。实际上:
  • 编写一个仅在成员为 null 时抛出异常的扩展方法似乎很奇怪,尤其是对于名为 IsNull 的方法,这就是为什么
  • 我会将 IsNull 重命名为 ThrowIfNull 并将 CheckIfNull 重命名为 IsNull