【发布时间】:2015-01-03 02:44:06
【问题描述】:
目前我在一个名为“Ensure”的类中使用这段代码,它本质上是一个静态方法的快捷类,我用来使抛出异常更容易,所以我不必经常写出至少 3 个行做一个例外,它总是可以在 1 行完成。
[DebuggerHidden, DebuggerStepThrough]
public static void ArgumentNotNull(object argument, string name)
{
if (argument == null)
{
throw new ArgumentNullException(name, "Cannot be null");
}
}
[DebuggerHidden, DebuggerStepThrough]
public static void ArgumentNotNull<T>(Expression<Func<T>> expr)
{
var e = (MemberExpression)expr.Body;
var val = GetValue<T>(e);
ArgumentNotNull(val, e.Member.Name);
}
我的问题是,目前在致电Ensure.ArgumentNotNull 时,我要么必须这样做:
Ensure.ArgumentNotNull(arg, "arg");
或
Ensure.ArgumentNotNull(() => arg);
因为我需要名称来解释哪个参数导致了异常本身的异常。
有没有一种方法可以在不需要 lambda 的 () => 部分的情况下调用 ArgumentNotNull 并且只需调用 Ensure.ArgumentNotNull(arg) 并且仍然能够获取传递的参数的名称,而无需特别指定也传递名称。
【问题讨论】:
-
你可以一直等待C# 6.0;你会有
nameof表达式。 -
@DStanley:这不是负担,只是看起来不够干净,而且这是一个推测性的问题,我问是因为我不知道答案。
-
您是否考虑过使用
Fody进行AOP 在构建类型中添加 Ensure。或者,您可以考虑使用代码协定和静态代码分析来“证明”arg 永远不会为空。 -
@Aron:不,我没有,因为那不是我想要达到的目标。
-
@bizzehdee 你应该看看这个...github.com/Fody/NullGuard