“保留”/在作为参数传递时引用变量名称
本文关键字:参数传递 引用 变量名 保留 | 更新日期: 2023-09-27 18:32:36
使用字符串插值,我尝试编写一种方法,该方法迭代任意数量的对象以评估每个对象的名称和值。
因此,请考虑以下事项:
private string ParametersMessage(params object[] parameters)
{
var msg = "Parameters: ";
for (int i = 0; i < parameters.Length; i++)
{
msg += $"{nameof(parameters[i])}:{parameters[i]}'r'n";
}
return msg;
}
您无法从 StackOverflow 语法突出显示中分辨出来 - 但这不起作用,在一百万年内不起作用,因为parameters[i]
没有名称,所以nameof
无法完成这项工作。
我可以这样称呼此方法:
int myNumber = 123;
string myWord = "hello";
var myMessage = ParametersMessage(myNumber, myWord);
现在,由于我传递了myNumber
和myWord
作为论据,它们已经失去了它们的名字。 我是否需要传递指针或其他引用变量名称的方式?如何从列表中的每个对象的名称和值构建字符串?
上下文
在日志记录期间,我通常会连接一大堆参数名称和值,以便通过查看哪个特定记录/对象失败 XYZ 来帮助更具体地诊断问题。我正在尝试使我的方法足够通用,以避免编写许多字符串生成器方法。
我尝试过什么
我已经尝试了上述方法(您可以看到我的尝试(,但我也考虑过传递带有值的nameof
结果。但在这一点上,我很快就又恢复到让它变得过于具体。
注意
我不是专家,但我有足够的经验知道上面的语法是愚蠢的。我想您可以将我的问题解释为"为我提供一种替代方法,以解决我用上面的代码示例说明的内容"。
你不能。
该方法的签名揭示了它:从编译器的角度来看,出于所有实际目的,它是一个匿名的值数组,没有与之关联的名称。
为了更清楚地说明,为了论证起见,让我们假设你这样称呼它:
ParametersMessage(1, 2, 3, 4, 5);
在这种情况下,参数名称会是什么?
我不确定这是否会有所帮助,但你可以制作一个流畅的界面,以便你可以像这样构建消息:
string msg = Parameters("name1", value1).And("name2", value2).ToString();
更新
这既不优雅也不粗鲁,但您仍然可以隐式传递"参数名称":
public void Test()
{
var foo = "bla";
var bar = "blub";
var msg = Parameters(() => foo).And(() => bar).ToString();
// msg contains now "foo = bla, bar = blub"
}
实现
public class Params
{
private readonly IDictionary<string, object> _params = new Dictionary<string, object>();
public Params And(Expression<Func<object>> exp)
{
var body = exp.Body as MemberExpression;
_params[body.Member.Name] = exp.Compile().Invoke();
return this;
}
public override string ToString()
{
return String.Join(", ", _params.Select(pair => String.Format("{0} = {1}", pair.Key, pair.Value)));
}
}
public Params Parameters(Expression<Func<object>>expr)
{
return new Params().And(expr);
}