这里是我的代码的简化:C#:转换一个集合到PARAMS []
void Foo(params object[] args)
{
Bar(string.Format("Some {0} text {1} here {2}", /* I want to send args */);
}
string.Format
需要发送作为params
的参数。有什么方法可以将args
集合转换为string.Format
方法的参数?
这里是我的代码的简化:C#:转换一个集合到PARAMS []
void Foo(params object[] args)
{
Bar(string.Format("Some {0} text {1} here {2}", /* I want to send args */);
}
string.Format
需要发送作为params
的参数。有什么方法可以将args
集合转换为string.Format
方法的参数?
的params
关键字只有语法糖,使您可以拨打任何数量的参数这样的方法。但是,这些参数总是作为数组传递给方法。
这意味着Foo(123, "hello", DateTime.Now)
相当于Foo(new object[] { 123, "hello", DateTime.Now })
。
可以因此从Foo
直接传递参数给string.Format
这样的:
void Foo(params object[] args)
{
Bar(string.Format("Some {0} text {1} here {2}", args));
}
然而,在这种特殊情况下,你需要三个参数(因为你有{0},{1}和{2 }以你的格式)。因此,您应该将您的代码更改为:
void Foo(object arg0, object arg1, object arg2)
{
Bar(string.Format("Some {0} text {1} here {2}", arg0, arg1, arg2));
}
......或按照Marcelo的建议。
在将它们作为一个单独的参数:
Bar(string.Format("Some {0} text {1} here {2}", args));
你可以尝试使用object.GetType(),例如
void Foo(params object[] args)
{
List<string> argStrings = new List<string>();
foreach (object arg in args)
{
if (args.GetType().Name == typeof(String).Name)
{
argStrings.Add((string)arg);
}
else if (args.GetType().Name == typeof(DateTime).Name)
{
DateTime dateArg = (DateTime)arg;
argStrings.Add(dateArg.ToShortDateString());
}
else
{
argStrings.Add(arg.ToString());
}
}
Bar(string.Format("Some {0} text {1} here {2}", argStrings.ToArray()));
}
这没什么按照我的要求做,但谢谢你的尝试。顺便说一句,没有必要比较类型名称,你可以检查'if(arg是DateTime)'等。 – 2011-04-04 09:48:49
没有指定参数的个数类型。应该是'params string [] args'。除此之外,你可以通过它作为一个正常的数组。 'params'只是一个编译器关键字,它根据发送的参数构建一个数组。 – HuBeZa 2011-04-04 08:15:45
@HuBeZa:他指定了类型:它是'object'。为什么他应该限制自己的字符串参数? – ChrisWue 2011-04-04 08:18:23
@Chris,无论是浏览器还是我的眼睛都有问题。我可以发誓它是'无效Foo(params args [])''。我需要一个假期:) – HuBeZa 2011-04-04 08:25:32