从该方法中获取调用方法的变量的名称

本文关键字:方法 变量 获取 调用 | 更新日期: 2023-09-27 18:27:25

我想为对象创建一个扩展方法,检查对象是否为null,如果为null则抛出异常。不过,我想保留原始变量名。我能从扩展方法中得到它吗?必须编写customer.NotNull("customer")customer.NotNull()是"麻烦的"。

从该方法中获取调用方法的变量的名称

不,很遗憾你不能。变量名称在运行时不部分可用。但是,您可以使用以下表达式:

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);

正如另一位所说,但请注意,编译表达式很慢。。。因此,该变体接收作为参数的值。你必须写更多,但对于被调用了数百次的方法,它可能会更好。

[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]使得调试器不会介入该方法。最后,如果方法抛出,通常是因为您传递了什么,而不是方法中有什么。