我想做下一个:
void SomeMethod ()
{
ParamMethod1 (1,2,3);
}
void ParamMethod1 (params object[] arg)
{
ParamMethod2 (0, arg); //How to call ParamMethod2 in order to it works
//as I want
}
void ParamMethod2 (params object[] arg)
{
//I want 'arg' contains 0,1,2,3 instead of 0, System.object[]
}
感谢您的帮助。
答案 0 :(得分:2)
您可以使用LINQ执行此操作,但仍需要ToArray()
ParamMethod2(new object [] { 0 }.Concat(arg).ToArray());
编辑添加:
根据有关性能的评论,我在建议的方法之间进行了一些非常基本的性能比较。
拨打100万电话
80ms -- Direct call: ParamMethod2(0,1,2,3);
280ms -- Using CopyTo
400ms -- Using LINQ
590ms -- Using AddRange
当然,如果您将对象更改为int以及其他一些内容,则可以进一步提高性能。我个人使用LINQ,因为99%的情况下它足够快,而在另一种情况下,我不会首先使用params。
答案 1 :(得分:1)
一种方式,虽然不一定理想,但可能只是:
void ParamMethod1 (params object[] arg)
{
var args = new List<object>();
args.Add(0);
if (arg != null)
{
args.AddRange(arg);
}
ParamMethod2(args.ToArray());
}
也就是说,不管这是怎么做的,我们需要将0
和arg
的内容组合成一个集合 - 无疑是一种更有效的方式,甚至可能是一个更简单的方法,我今天早上看不到咖啡的缺乏,但这可以解决问题,可以这么说。
答案 2 :(得分:1)
void ParamMethod1 (params object[] arg)
{
if(arg == null || arg.Length == 0)
{
ParamMethod2(0);
return;
}
var newArray = new int[arg.Length + 1];
newArray[0] = 0;
arg.CopyTo(newArray,1);
ParamMethod2 (newArray);
}
答案 3 :(得分:1)
更改此方法
void ParamMethod2(params object [] arg) { //我想'arg'包含0,1,2,3而不是0,System.object [] }
到
void ParamMethod2(int firstValue,params object [] arg) { //现在,firstvalue总是有0,剩下的传递变量将有1,2,3等。 }
希望这是你的要求。
请注意,如果您想要一个只有params作为参数的方法,那么您将遇到问题,因为您的编译器始终会调用此显式的第一个参数签名,而不是仅使用params签名方法。