2010-11-21 14 views
1

Hat C# die bequeme/Standardmethode, Funktionsparameterlisten in Tupel und zurück zu "werfen"?Wie kann ich eine Funktionsparameterliste in Tuple umwandeln

Diese "Cast" -Operation, wenn irgendwo in .NET existiert, sollte nicht auf der Sprachebene realisiert werden (da es keinen solchen Typ gibt: "Funktionsparameterliste"), aber mit Reflektion. Im Vorwärtsfall gibt es den genauen Typ des Tupels zurück (durch den Funktionsnamen), in der Rückwärtsfall - Aufruffunktion mit Tupelfeldern.

Es funktioniert wie packen/entpacken Funktion Parameter Listen zu Tupel.

Es sollte irgendwie möglich sein, da Tupel und Funktionsparameter beide nicht heterogene Listen sind und dies ist sehr natürlich Operation.

anhängen: Ja, das in der Sprache nicht möglich ist, sondern auch weiß, dass ich/das Gefühl, dass dies möglich ist, Reflexion und Stapel-Browsing. Wenn es keinen solchen Code im Rahmen sind bin ich interessant tatsächlich diese 5 Menschen in der Welt zu finden, die solche Dinge tun :)

+0

Vielleicht bin ich dumm, weil ich keine Ahnung habe, wovon du sprichst. –

+0

Hallo, ich denke, Sie versuchen, Parameter packen/entpacken wie in Python richtig? Dies ist nicht möglich (soweit ich weiß) in C#. Und in C# sind die Sammlungen (Listen) vom selben Typ, so dass Sie nicht verschiedene Datentypen in derselben Sammlung speichern können (C# 2.0). – SubniC

Antwort

3

Wenn das ist, was würden Sie tun:

void Foo(int a, bool b, string c) 
{ 
    Tuple<int,bool,string> argsTuple = pack(); 
}         // ^^^^^^ 

. .. dann ist die Antwort nein, Sie können bequem die Argumente einer Methode in ein Tupel umwandeln. Sie können dies wahrscheinlich mit Reflektion tun, aber es ist nichts, was das .NET Framework standardmäßig bereitstellt.

In Bezug auf das Gegenteil, ein Tupel über ein Funktionsparameterliste Auspacken — heißt Foo(argsTuple) —, können Sie definitiv nicht tun, dass in C#.

+0

besser: var args = GetCurrentCallParameters(); :) –

+0

Ich weiß, dass dies nur durch Reflexion (und Stack-Browsing) möglich ist; aber vielleicht ist dies schon im Rahmen getan. –

+0

@Roman, ich nehme an "besser" hängt vom Geschmack ab. Während ich in Bezug auf Typen normalerweise nicht so explizit bin, erwähnt mein Codebeispiel den genauen Tuple-Typ, um zu zeigen, was passieren soll. Es ist "pack" in Kleinbuchstaben, um darauf hinzuweisen, dass es sich nicht um eine BCL-Methode handelt, sondern um eine Sprachfunktion (für die diese Art von Operation normalerweise gilt, siehe z. B. Python). – stakx

1

Das Auspacken kann recht einfach sein. Sie können nur Erweiterungsmethoden erstellen.

public static R Apply<T, U, R>(this Tuple<T, U> t, Func<T, U, R> f) 
{ 
    return f(t.Item1, t.Item2); 
} 

public static R Apply<T, U, V, R>(this Tuple<T, U, V> t, Func<T, U, V, R> f) 
{ 
    return f(t.Item1, t.Item2, t.Item3); 
} 

Und so weiter. Dies kann auch für Aktionen durchgeführt werden. Dann können Sie diese Erweiterungsmethoden auf folgende Weise verwenden.

tuple.Apply(Method) 
+0

Ja, du bist richtig. Ich hatte erwartet, dass das Auspacken auch einfach und schon irgendwo realisiert sein könnte. (Ich hatte eine Idee, solche Tricks in der Codegenerierung zu verwenden). –

Verwandte Themen