如何在被调用的方法中获取传递的变量的名称?
仅作为附加参数传递?
也许有一些模拟CallerMemberNameAttribute只是为了获取传递的变量的名称?
例如:
var variable = "some_value"; // имя переменной nameof(variable)
DoAction(variable);
public void DoAction(string value)
{
var valueVariableName = ... // хочу получить имя переменной ("variable")
}
如有任何想法,我将不胜感激。
注意:最初它被设想做类似的事情
public void DoAction(string value, [PreviousParameterName] string valueParameterName = null)
{
var valueParameterName = ... // имя переменной (== "variable")
}
但是在弄清了创建自定义属性(在编译时解决)的问题之后,很明显这是不可能做到的。当然,不建议使用反射来解决这个问题(也许它甚至不起作用,我不明白)。
例如,像这样:
但它会慢慢起作用。同样,任何其他类似的“技术”都会运行缓慢。仅仅因为您可以说服编译器仅通过将变量的名称转换为字段或属性来保存它——并且没有办法从对象中快速获取名称未知的字段的值。
如果你不是无条件地需要一个变量名,而只是在特殊情况下用于调试目的,那么如果你有调试符号,你可以尝试从源代码中获取它。
例如,像这样:
C# 8.0 将带来一个新属性:
使用它,您可以获得传递的变量的名称。
引用我在这里给出的答案:
如果方法声明如下:
并这样称呼:
,然后编译器将替换第二个参数的值:
因此,性能不会下降,因为这将在编译阶段完成。