2010-01-07 21 views
5

In Python der * ermöglicht es mir, eine Liste als Funktionsparameter übergeben:C#, Pass Array als Funktionsparameter

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

Kann ich dieses Verhalten in C# mit einem Array replizieren?

Danke.

Antwort

9

Außer:

  1. die Methodensignatur Ändern eines Array
  2. Hinzufügen einer Überlast zu übernehmen, die ein Array annimmt, extrahiert die Werte und Anrufe die ursprüngliche Überlast
  3. Mit Reflektion die Methode aufrufen

dann leider, nein, das geht nicht.

Schlüsselwortbasierte und positionsbasierte Parameterübergabe wie in Python wird in .NET nicht unterstützt, außer durch Reflektion.

Beachten Sie, dass es wahrscheinlich mehrere gute Gründe dafür gibt, warum dies nicht unterstützt wird, aber die, die mir in den Sinn kommt, ist nur "warum müssen Sie das tun?". Normalerweise verwenden Sie dieses Muster nur, wenn Sie die Methode in eine andere Ebene einfügen, und in .NET haben Sie Delegierte stark typisiert. In der Regel bleibt also nur noch reflektionsbasierter Code übrig, und selbst dann haben Sie normalerweise einen starken Zugriff auf die Methode wird aufgerufen.

Also meine Bauchreaktion, auch wenn ich Ihre Frage beantwortet habe, ist, dass Sie dies nicht tun sollten, und finden Sie eine bessere, .NET-freundliche Art und Weise zu erreichen, was Sie wollen.

Hier ist ein Beispiel unter Verwendung von Reflexion:

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 diese eher als die params-Lösung, weil es die Frage richtiger entspricht. Die params Lösung wäre korrekt, wenn die Frage gestellt würde, wie man eine Funktion wie "def add (* numbers)" umwandelt: –

+0

Danke. Dies kommt meinem Wunsch am nächsten, da ich die Methodensignatur nicht ändern kann. Zeit, sich über C# und Reflektion zu informieren, obwohl es sich anhört, als würde ich meinen Ansatz dazu umgestalten. – Mark

+0

Nur wenn Sie die Signatur nicht ändern können, und nur dann, wenn Sie die Werte * tatsächlich * als Array übergeben müssen. Warum machst du das überhaupt? –

12

Die params Schlüsselwort erlaubt etwas ähnliches

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

Sie Reflektion verwenden könnte. Wenn es jedoch die ganze Zeit über eine variable Länge hat, ist es vielleicht besser, ein Array als Methode zu verwenden, aber Sie müssen die Liste immer noch analysieren, es sei denn, es handelt sich um ein Grundbedürfnis, das mit den Auflistungsmethoden/Array-Methoden behandelt werden kann.

1

Ich bin mir ziemlich sicher, dass Sie Reflection verwenden können, um auf Ihre Methode zuzugreifen, und verwenden Sie dann , wobei Sie Ihr Array als Parameterliste verwenden. Irgendwie rund herum.

Verwandte Themen