7

我想为检查对象是否为空并抛出异常的对象创建一个扩展方法。我想保留原来的变量名。我可以以某种方式从扩展方法中获取它吗?必须写customer.NotNull("customer")vs是“麻烦的” customer.NotNull()

4

2 回答 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 回答