2011-04-04 167 views
10

这里是我的代码的简化: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方法的参数?

+0

没有指定参数的个数类型。应该是'params string [] args'。除此之外,你可以通过它作为一个正常的数组。 'params'只是一个编译器关键字,它根据发送的参数构建一个数组。 – HuBeZa 2011-04-04 08:15:45

+0

@HuBeZa:他指定了类型:它是'object'。为什么他应该限制自己的字符串参数? – ChrisWue 2011-04-04 08:18:23

+0

@Chris,无论是浏览器还是我的眼睛都有问题。我可以发誓它是'无效Foo(params args [])''。我需要一个假期:) – HuBeZa 2011-04-04 08:25:32

回答

13

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的建议。

4

在将它们作为一个单独的参数:

Bar(string.Format("Some {0} text {1} here {2}", args)); 
0

你可以尝试使用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())); 
    } 
+0

这没什么按照我的要求做,但谢谢你的尝试。顺便说一句,没有必要比较类型名称,你可以检查'if(arg是DateTime)'等。 – 2011-04-04 09:48:49