【问题标题】:Lambda expression check if null helperLambda 表达式检查是否为 null 助手
【发布时间】:2015-08-31 14:33:55
【问题描述】:

我希望能够写作

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

但它是不工作的接缝。 我该如何解决?

【问题讨论】:

  • 您正在将objnull 进行比较 - 它从来没有,因为您上面的一行正在为它分配一个 lambda 函数。插入检查obj(root) == null。除此之外,none 您的函数中的任何一个都不会返回 truefalse 并且它们不应该编译。请检查您提供的代码
  • 请告诉我们MyObject.IsNull(p =&gt; p.MyObjectProperty)的行为应该是什么。如果MyObjectPropertynull,您似乎希望抛出一个异常,但是还有一个从未使用过的bool 返回值。
  • 刚刚用void 修复了bool。是的,我希望以防万一CheckIfNull&lt;T&gt;(expression) == true
  • 好吧,现在说得通了:你试过我的答案吗?这样能解决吗?

标签: linq c#-4.0 lambda


【解决方案1】:

你有一个错误:

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

前一个比较将始终评估为 false,因为您实际上是在比较 o =&gt; 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

【讨论】:

  • 刚刚澄清了我的问题,最初我在记事本中修改了我的代码,所以我弄错了。
  • 仍然比较obj == null,而obj == null始终false!此外,您仍然没有在IsNull 中返回bool
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多