2011-04-04 20 views
10

Aquí es una simplificación de mi código:C#: Convertir una colección en params []

void Foo(params object[] args) 
{ 
    Bar(string.Format("Some {0} text {1} here {2}", /* I want to send args */); 
} 

string.Format requiere los argumentos enviados como params. ¿Hay alguna manera de convertir la colección args en parámetros para el método string.Format?

+0

No ha especificado el tipo de argumentos. Debería ser 'params string [] args'. Aparte de eso, podrías pasarlo como una matriz normal. 'params' es solo una palabra clave del compilador que crea una matriz a partir de los parámetros enviados. – HuBeZa

+0

@HuBeZa: Especificó el tipo: es 'objeto'. ¿Por qué debería limitarse a los parámetros de cadena? – ChrisWue

+0

@Chris, algo estaba mal con mi navegador o mis ojos. Puedo jurar que fue 'void Foo (params args [])'. Necesito unas vacaciones :) – HuBeZa

Respuesta

13

La palabra clave es única paramsazúcar sintáctico que le permite llamar a un procedimiento de este tipo con cualquier número de argumentos. Sin embargo, esos argumentos siempre se pasan al método como una matriz.

Esto significa que Foo(123, "hello", DateTime.Now) es equivalente a Foo(new object[] { 123, "hello", DateTime.Now }).

lo tanto, puede pasar los argumentos de Foo directamente a string.Format así:

void Foo(params object[] args) 
{ 
    Bar(string.Format("Some {0} text {1} here {2}", args)); 
} 

Sin embargo, en este caso particular, usted exige tres argumentos (porque tiene {0}, {1} y {2 } en su formato). Por lo tanto, debe cambiar su código a:

void Foo(object arg0, object arg1, object arg2) 
{ 
    Bar(string.Format("Some {0} text {1} here {2}", arg0, arg1, arg2)); 
} 

... o haga lo que le sugirió Marcelo.

4

pasar en un solo argumento:

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

Usted podría tratar de usar object.GetType(), por ejemplo

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

Esto no tiene nada que ver hacer con lo que pregunté, pero gracias por intentarlo. Por cierto, no hay necesidad de comparar los nombres de los tipos, solo puede marcar 'if (arg es DateTime)', etc. –

Cuestiones relacionadas