String.Format() - 重新传递参数,但添加更多参数
本文关键字:参数 添加 新传递 Format String | 更新日期: 2023-09-27 18:33:43
我想做这样的事情:
public string GetMessage(params object otherValues[]) {
return String.Format(this.Message, this.FirstValue, otherValues);
}
因此,我想将参数数组重新传递给String.Format()
但添加一个新参数。
方法是什么,知道我们可以"重建"一个新的对象数组,这似乎并不好。
public string GetMessage(params object[] otherValues)
{
return String.Format(this.Message, new[] { this.FirstValue }.Concat(otherValues).ToArray<object>());
}
您可以使用Concat
和ToArray
扩展方法:
public string GetMessage(params object[] otherValues)
{
var values = new[] { this.FirstName }.Concat(otherValues).ToArray();
return String.Format(this.Message, values);
}
如果other
参数通常很少,我会使用现有的重载:
public string GetMessage(params object[] otherValues) {
if (otherValues == null) return string.Format(this.Message, this.FirstValue);
switch (otherValues.Length)
{
case 0:
return string.Format(this.Message, this.FirstValue);
case 1:
return string.Format(this.Message, this.FirstValue, otherValues[0]);
case 2:
return string.Format(this.Message, this.FirstValue, otherValues[0], otherValues[1]);
default:
return string.Format(this.Message, new[] { this.FirstValue }.Concat(otherValues).ToArray());
}
}
预处理消息
如果您不希望在每个 GetMessage(...( 调用中创建新数组,则可以一次在消息开头插入 FirstValue 中。然后 GetMessage(...( 只对字符串使用 otherValues 参数。格式(...(。
Message 属性在设置 FirstValue 后初始化一次,例如在构造函数或 init 方法中,如下所示:
void InitMessage()
{
Message = String.Format(Message, FirstValue, "{0}", "{1}", "{2}", "{3}", "{4}");
}
InitMessage 方法使用 FirstValue 初始化 Message 中的第一个索引,并使用 "{index}" 初始化其余索引,即 "{0}"、"{1}"、"{2},...(允许包含比消息索引更多的params
元素(。
现在 GetMessage 可以调用 String.Format,而无需任何数组操作,如下所示:
public string GetMessage(params object[] otherValues)
{
return String.Format(Message, otherValues);
}
例:
假定以下属性值:
this.Message = "First value is '{0}'. Other values are '{1}' and '{2}'."
和this.FirstValue = "blue"
.
初始化消息将消息更改为:
"First value is 'blue'. Other values are '{0}' and '{1}'."
.
获取消息调用
GetMessage("green", "red")
结果在
"First value is 'blue'. Other values are 'green' and 'red'."
.
另一种混乱的方法是,如果您真的无法为数组创建另一个结构,请使用正则表达式破解格式。
private string FormatEval(Match m)
{
int val = -1;
string formatted = m.Value;
if (int.TryParse(m.Groups["index"].Value, out val))
formatted = val == 0 ? this.FirstValue : "{" + (val - 1).ToString() + "}";
return formatted;
}
public string GetMessage(params object[] otherValues)
{
string format = Regex.Replace(this.Message, @"'{(?<index>'d+)'}", FormatEval);
return string.Format(format, otherValues);
}
基本上只是解析格式化标记({0}、{1}(等的格式字符串。并降低他们的指数。如果令牌最初{0},请将其替换为 this。名字字符串。
从本质上讲,这样做是手动执行 String.Format 的第一步,然后将生成的字符串传递给 REAL String.Format 方法以完成。
传递离散元素
为了避免在每次 GetMessage 调用中创建数组,您可以通过其离散元素传递 otherValues:
public string GetMessage(params object[] otherValues)
{
return String.Format(Message,
FirstValue,
GetOrDefault(otherValues, 0),
GetOrDefault(otherValues, 1),
GetOrDefault(otherValues, 2),
GetOrDefault(otherValues, 3),
GetOrDefault(otherValues, 4));
}
private object GetOrDefault(object[] otherValues, int index)
{
if (otherValues == null)
return null;
if (index < otherValues.Length)
return otherValues[index];
return null;
}