“保留”/在作为参数传递时引用变量名称

本文关键字:参数传递 引用 变量名 保留 | 更新日期: 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);

现在,由于我传递了myNumbermyWord作为论据,它们已经失去了它们的名字。 我是否需要传递指针或其他引用变量名称的方式?如何从列表中的每个对象的名称和值构建字符串?

上下文

在日志记录期间,我通常会连接一大堆参数名称和值,以便通过查看哪个特定记录/对象失败 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);
}