2010-08-01 17 views
5

entiendo cómo obtener los nombres de los parámetros pasados ​​a un método, pero vamos a decir que tengo una declaración de método de la siguiente manera:¿Cómo puedo pasar un número variable de parámetros nombrados a un método?

static void ParamsTest(string template, params object[] objects) 

y quiero utilizar nombres de objeto/propiedad en mi plantilla para realizar sustituciones de bienes valores de propiedad en cualquiera de los objetos en mi parámetro `objects '. Vamos a continuación, dicen que llamo este método con:

ParamsTest("Congrats", customer, purchase); 

Sólo voy a ser capaz de recuperar dos nombres de los parámetros que intenta completar la plantilla, es decir, template y objects, y los nombres de los objetos de la colección objects están perdidos para siempre, o no?

Podría necesitar un List<object> como mi segundo parámetro, pero creo que de alguna manera hay una solución más elegante, tal vez con una lambda o algo así. No sé, no estoy acostumbrado a usar lambdas fuera de LINQ.

+1

Qué pasa con un 'Diccionario ', donde la cadena es el nombre de la variable? – Oded

+0

+1. de alguna manera puede usar los parámetros reales de C# 4? 'ParamTest (cliente: cliente, compra: compra)' – mpen

+0

Sniff :-(No puedo usar C# 4. – ProfK

Respuesta

5

Inpsired por Mark puedo ofrecer un tipo de respuesta anónima:

using System; 

namespace ConsoleApplication5 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ParamsTest(new { A = "a", B = "b"}); 
     } 

     public static void ParamsTest(object o) 
     { 
      if (o == null) 
      { 
       throw new ArgumentNullException(); 
      } 
      var t = o.GetType(); 
      var aValue = t.GetProperty("A").GetValue(o, null); 
      var bValue = t.GetProperty("B").GetValue(o, null); 
     } 
    } 
} 

Sin embargo, esto tiene inconvenientes:

  • Sin tipo de seguridad. Me puede pasar en cualquier objeto
  • me puede pasar en un tipo anónimo con diferentes miembros y/o tipos que los esperados
  • También debe hacer más comprobar que en este breve muestra de
+0

También puede reordenar parámetros en la llamada :) –

+1

+1 para mí, lol. – mpen

+0

Ojalá pudiera votar Marcar también, pero la suya no es una respuesta. Gracias, esta es mi ruta elegida. – ProfK

0

se podría definir un parámetros del objeto:

public class ParamsTestParams { 
    public string A { get; set; } 
    public string B { get; set; } 

    public static readonly ParamsTestParams Empty = new ParamsTestParams(); 
} 

cambiar los métodos de firma a:

ParamsTest(ParamsTestParams parameters) 

y llame a su método de este modo:

ParamsTest(new ParamsTestParams { A = "abc" }); 

o:

ParamsTest(new ParamsTestParams { B = "abc" }); 

o:

ParamsTest(new ParamsTestParams { A = "abc", B = "xyz" }); 

o:

ParamsTest(ParamsTestParams.Empty); // instead of null so you don't have to do null checks in the method's body 

y así sucesivamente.

+1

podría usar un objeto anónimo en su lugar en C# 4 – mpen

+0

sí, pero obtener sus miembros y sus nombres dentro de ParamsTest no es una tarea simple - implica reflexión –

+0

Ejemplo anónimo de tipo agregado –

0

probablemente me acaba de hacerlo de esta manera:

static void ParamsTest(string template, object[] objects) 

y lo llaman así:

ParamsTest("Congrats", new object[] { customer, purchase }); 
+0

Al igual que en mi muestra de tipo anónimo, realmente no tiene seguridad de tipo, tampoco tiene nombres de parámetros. Además, puede tener una sintaxis más corta de "nuevo objeto [] {...}" a "nuevo [] {...}" –

+0

Realmente, realmente necesito nombres de parámetros. – ProfK

+0

Entonces creo que la sugerencia de Oded de Dictionary es su opción más fácil – snurre

Cuestiones relacionadas