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
我希望能够写作
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