我想为检查对象是否为空并抛出异常的对象创建一个扩展方法。我想保留原来的变量名。我可以以某种方式从扩展方法中获取它吗?必须写customer.NotNull("customer")
vs是“麻烦的” customer.NotNull()
。
问问题
1178 次
2 回答
2
不,不幸的是你不能。变量名称在运行时不可用。但是,您可以使用如下表达式:
void NotNull<T>(Expression<Func<T>> expression)
{
var me = expression.Body as MemberExpression;
var name = me.Member.Name;
var value = expression.Compile().Invoke();
...
}
NotNull(() => customer);
于 2013-08-11T18:34:04.023 回答
0
正如另一个所说,但请注意编译表达式很慢......所以这个变体接收值作为参数。你必须写更多,但是对于被调用数百次的方法,它可能会更好。
[DebuggerHidden]
public static void NotNull<T>(T value, Expression<Func<T>> exp) where T : class
{
if (value != null)
{
return;
}
var body = exp.Body as MemberExpression;
if (body == null)
{
throw new ArgumentException("Wrongly formatted expression");
}
throw new ArgumentNullException(body.Member.Name);
}
用法:
NotNull(str, () => str);
这样[DebuggerHidden]
调试器就不会进入该方法。最后如果方法抛出,通常是因为你传递了什么,而不是方法中有什么。
于 2013-08-11T18:50:22.400 回答