从该方法中获取调用方法的变量的名称
本文关键字:方法 变量 获取 调用 | 更新日期: 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]
使得调试器不会介入该方法。最后,如果方法抛出,通常是因为您传递了什么,而不是方法中有什么。