我想做那样的事情:
public string GetMessage(params object otherValues[]) {
return String.Format(this.Message, this.FirstValue, otherValues);
}
所以,我想将一系列参数传递给String.Format()
但是添加一个新参数。
最好的方法是什么,知道我们可以“重建”一个新的对象数组,这看起来不太好。
答案 0 :(得分:17)
public string GetMessage(params object[] otherValues)
{
return String.Format(this.Message, new[] { this.FirstValue }.Concat(otherValues).ToArray<object>());
}
答案 1 :(得分:3)
public string GetMessage(params object[] otherValues)
{
var values = new[] { this.FirstName }.Concat(otherValues).ToArray();
return String.Format(this.Message, values);
}
答案 2 :(得分:1)
如果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());
}
}
答案 3 :(得分:1)
如果您不想在每个 GetMessage(...)调用中创建新数组,可以将 FirstValue 插入消息一开始一次。然后 GetMessage(...)只使用 string.Format(...)的 otherValues 参数。
消息属性在 FirstValue 设置后初始化一次,例如在构造函数或init方法中如下:
void InitMessage()
{
Message = String.Format(Message, FirstValue, "{0}", "{1}", "{2}", "{3}", "{4}");
}
InitMessage 方法使用 FirstValue 初始化消息中的第一个索引,使用“{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"
。
InitMessage 将消息更改为:
"First value is 'blue'. Other values are '{0}' and '{1}'."
。
GetMessage 致电
GetMessage("green", "red")
结果
"First value is 'blue'. Other values are 'green' and 'red'."
。
答案 4 :(得分:0)
如果你真的无法为数组创建另一个结构,那么另一个混乱的方法是使用RegEx破解格式化。
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.FirstName字符串。
基本上这是做什么的,手动执行String.Format的第一步,然后将结果字符串传递给REAL String.Format方法来完成。
答案 5 :(得分:0)
为避免在everey 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;
}