2010-01-07 4 views
5

En python le * me permet de transmettre une liste en tant que paramètres de fonction:C#, Array passe en fonction Paramètres

def add(a,b): return a+b 
x = [1,2] 
add(*x) 

Puis-je reproduire ce comportement en C# avec un tableau?

Merci.

Répondre

9

À l'exception de:

  1. Modification de la signature de la méthode d'accepter un tableau
  2. Ajout d'une surcharge qui accepte un tableau, extrait les valeurs et les appels la surcharge d'origine
  3. Utilisation de la réflexion pour appeler la méthode

alors malheureusement, non, vous ne pouvez pas faire cela.

Le passage de paramètre basé sur un mot clé et sur une position, comme dans Python, n'est pas pris en charge dans .NET, à l'exception de la réflexion traversante.

Notez qu'il y a probablement plusieurs bonnes raisons pour lesquelles ceci n'est pas supporté, mais celui qui me vient à l'esprit est juste "pourquoi avez-vous besoin de faire ceci?". En règle générale, vous n'utilisez ce modèle que lorsque vous encapsulez la méthode dans un autre calque, et dans .NET vous avez des délégués fortement typés, donc tout ce qui reste est généralement du code basé sur la réflexion, et même là vous méthode appelée. Donc, ma réaction viscérale, même si j'ai répondu à votre question, est que vous ne devriez pas faire cela, et de trouver une meilleure façon, plus conviviale .NET pour accomplir ce que vous voulez.

Voici un exemple de réflexion en utilisant:

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

Cette version a été mise à la hausse plutôt que la solution params car elle correspond plus correctement à la question. La solution de params serait correcte si la question demandait comment convertir une fonction telle que "def add (* numbers):" –

+0

Merci. C'est le plus proche de ce que je cherchais car je ne peux pas modifier la signature de la méthode. Il est temps de lire sur C# et la réflexion, bien que, il me semble que je devrais juste refactor mon approche à ceci. – Mark

+0

Seulement si vous ne pouvez pas changer la signature, et seulement si vous devez réellement * passer * les valeurs en tableau. Pourquoi fais-tu ça de toute façon? –

12

Le mot-clé params permet quelque chose de similaire

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

Vous pouvez utiliser la réflexion. Cependant, si c'est une longueur variable tout le temps, il vaut mieux utiliser un tableau comme méthode de défenition, mais vous aurez toujours besoin d'analyser la liste sauf si c'est un besoin fondamental qui peut être géré par les méthodes de collection/tableau.

1

Je suis assez sûr que vous pourriez utiliser la réflexion pour accéder à votre méthode, puis utilisez Invoke, en utilisant votre tableau comme la liste des paramètres. Un peu de rond-point, cependant.