2010-01-07 6 views

Respuesta

9

excepción de:

  1. Cambio de la firma del método para aceptar una matriz
  2. Adición de una sobrecarga que acepta una matriz, extrae los valores y las llamadas la sobrecarga original
  3. Usando la reflexión para llamar al método

entonces desafortunadamente, no, no puedes hacer eso.

El paso de parámetros basado en palabras y posicionales como en Python no se admite en .NET, excepto a través de la reflexión.

Tenga en cuenta que probablemente haya varias buenas razones para que esto no sea compatible, pero la que me viene a la mente es simplemente "¿por qué necesita hacer esto?". Normalmente, solo usa este patrón cuando está envolviendo el método en otra capa, y en .NET tiene delegados fuertemente tipados, por lo que normalmente lo único que queda es un código basado en la reflexión, e incluso entonces, por lo general, tiene un fuerte control sobre el método que se llama.

Así que mi reacción instintiva, incluso si respondía a su pregunta, es que no debería hacer esto, y encontrar una manera mejor y más amigable con .NET para lograr lo que desea.

He aquí un ejemplo utilizando la reflexión:

using System; 
using System.Reflection; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     public Int32 Add(Int32 a, Int32 b) { return a + b; } 
     static void Main(string[] args) 
     { 
      Program obj = new Program(); 

      MethodInfo m = obj.GetType().GetMethod("Add"); 
      Int32 result = (Int32)m.Invoke(obj, new Object[] { 1, 2 }); 
     } 
    } 
} 
+0

Upvoted esta en lugar de la solución de params porque coincide más correctamente con la pregunta. La solución de params sería correcta si la pregunta le preguntara cómo convertir una función como "def add (* numbers):" –

+0

Gracias. Esto es lo más cercano a lo que estaba buscando, ya que no puedo modificar la firma del método. Es hora de leer C# y reflexionar, aunque parece que debería refactorizar mi enfoque de esto. – Mark

+0

Solo si no puede cambiar la firma, y ​​solo si realmente * debe * pasar los valores como una matriz. ¿Por qué haces esto de todos modos? –

12

La palabra clave params permite algo similar

public int Add(params int[] numbers) { 
    int result = 0; 

    foreach (int i in numbers) { 
     result += i; 
    } 

    return result; 
} 

// to call: 
int result = Add(1, 2, 3, 4); 
// you can also use an array directly 
int result = Add(new int[] { 1, 2, 3, 4}); 
2

Se podría utilizar la reflexión. Sin embargo, si es una longitud variable todo el tiempo, sería mejor utilizar una matriz como defensa de su método; sin embargo, aún tendría que analizar la lista a menos que sea una necesidad básica que pueda ser manejada por métodos de colección/matriz.

1

Estoy bastante seguro de que podría usar el reflejo para acceder a su método, y luego usar Invoke, usando su matriz como la lista de parámetros. Aunque tipo de vueltas.

Cuestiones relacionadas