2016-07-22 29 views
3

Ich habe mehrere Methoden in meinem Skript, die Transformationen auf einem mehrdimensionalen Array, wie Transponieren, verschieben, swapColumn..etc Ich möchte diese Änderungen rückgängig machen können indem Sie die Methoden in einem Stapel speichern und ihre Inverse verwenden. Was wäre ein guter Weg, um Methoden in einer Liste zu speichern? bis jetzt habe ich zwei appraoches 1- einen Stapel von Buchstaben, wo jeder Buchstabe einen Aufruf an eine Methode, zum Beispiel t-> transopse darstellt. 2- eine abstrakte Klasse bauen alle meine Methoden als Unterklassen genannt Transformation und machen so, dass mein Stack alle Methoden in einem ListFunc oder Action Verwendung speichern Sie könnenSo speichern Sie Methoden in einem Stapel oder einer Liste im Allgemeinen C#

+0

Haben alle eine gemeinsame Signatur? Dann können Sie sie in eine List setzen TaW

+0

was bedeutet es für Methoden, gemeinsame Signaturen zu haben? ist es Rückgabewert? –

+0

@RaedTabani die Signatur ist die Kombination aller Parametertypen und der Rückgabetyp; So haben 'int Foo (int x)' und 'int Bar (int y)' dieselbe Signatur, wie 'T Blah (T val)' für 'T = int', aber' void Blop (string s) ' nicht –

Antwort

3

verschiedene Methoden speichern:

List<Func<T1, T2, TReturn>> 

Welche ist äquivalent zu:

TReturn MyFunction(T1 input1, T2 input2) 

Oder:

List<Action<T1, T2>> 

, die gleich ist:

void MyFunction(T1 input1, T2 input2) 
+0

aber was ist, wenn meine Funktionen keinen Typ (void) zurückgegeben haben? –

+0

kann ich stattdessen Action verwenden? –

+0

Ersetzen Sie dann 'TReturn' durch' void'. –

0

Wenn alle Methoden, die Sie keine gemeinsame Signatur haben ein paar Optionen. Sie können einen generischen Stack von object s erstellen und sie alle dort hineinschieben, dann, wenn Sie Pop machen, die Signatur mit möglichen Signaturen vergleichen und entsprechend darstellen.

Ein besserer Entwurf könnte die gesamte Methode in einer anderen Struktur kapseln und einen Stack daraus machen, oder Reflektion verwenden, um Parametertypen und Rückgabetypen zu erhalten und sie mit dem von Ihnen benötigten Wert zu füllen auch in der Struktur speichern, vielleicht mit einer List von object s wieder und zurückwerfen). Wenn Sie Reflektion verwenden, müssen Sie möglicherweise nicht einmal das Funktionsobjekt selbst speichern und nur Zeichenfolgen für Klassen- und Methodennamen verwenden.

+0

Wenn ich Methoden als Objekt behandeln möchte, wie rufe ich sie dann auf? zum Beispiel object temp = stack.pop() ... –

+0

@RaedTabani kannst du sie überprüfen (zB mit 'if (temp typeof yourPossibleFunctionType)') und sie in den Funktionstyp umwandeln, dann rufe es einfach normal auf Natürlich, wenn es viele mögliche Typen gibt, wäre das ineffizient und der zweite Absatz wäre besser. –

0

Eine mögliche Verbesserung shad0wk Antwort, falls Sie mit Ihrem ersten Idee gehen wollen, ist vielleicht

Dictionary<string, List<Func<T1, T2, TReturn>>> 

diese Weise können Sie einfach Ihre Methoden und deren inverse in einer Liste mit zugegriffen paaren haben ein gleicher Schlüssel.