我希望能够写
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;
}
但接缝不起作用。 我该如何解决这个问题?
答案 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