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

时间:2016-01-29 14:48:15

标签: c# variables pointers string-interpolation

使用字符串插值,我正在尝试编写一个迭代任意数量的对象的方法,以评估每个对象的名称和值。

所以,请考虑以下事项:

    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 的结果传递给值。但就在那时,我已经很快恢复了再次使它变得过于具体。

注意

我不是专家,但我有足够的经验知道上面的语法很傻。我想你可以把我的问题解释为“给我一个替代方法,用我上面的代码示例说明的内容”。

2 个答案:

答案 0 :(得分:1)

你做不到。

该方法的签名给出了它:从编译器的角度来看,并且出于所有实际目的,它是一个匿名的值数组,没有与之关联的名称。

为了更清楚地说明,让我们为了论证而假设你把它称为:

ParametersMessage(1, 2, 3, 4, 5);

在这种情况下,参数名称是什么?

答案 1 :(得分:0)

我不确定这是否会有所帮助,但您可以制作类似于流畅界面的内容,以便您可以构建如下消息:

string msg = Parameters("name1", value1).And("name2", value2).ToString();

<强>更新

这既不优雅也不粗糙,但你仍然可以传递&#34;参数名称&#34;隐式:

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