Lambda表达式检查是否为空助手

时间:2015-08-31 14:33:56

标签: linq c#-4.0 lambda

我希望能够写

 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;
}

但接缝不起作用。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

你有一个错误:

比较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