使用字符串插值,我正在尝试编写一个迭代任意数量的对象的方法,以评估每个对象的名称和值。
所以,请考虑以下事项:
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
的结果传递给值。但就在那时,我已经很快恢复了再次使它变得过于具体。
我不是专家,但我有足够的经验知道上面的语法很傻。我想你可以把我的问题解释为“给我一个替代方法,用我上面的代码示例说明的内容”。
答案 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);
}