Wie erstelle ich ein Wörterbuch, in dem ich Funktionen speichern kann?
Vielen Dank.
Ich habe über 30 Funktionen, die vom Benutzer ausgeführt werden können. Ich möchte die Funktion folgendermaßen ausführen können:
private void functionName(arg1, arg2, arg3)
{
// code
}
dictionaryName.add("doSomething", functionName);
private void interceptCommand(string command)
{
foreach ( var cmd in dictionaryName )
{
if ( cmd.Key.Equals(command) )
{
cmd.Value.Invoke();
}
}
}
Die Funktionssignatur ist jedoch nicht immer gleich und weist daher unterschiedliche Argumente auf.
Antworten:
So was:
Auf diese Weise können Sie Funktionen speichern, die einen Zeichenfolgenparameter verwenden und einen Booleschen Wert zurückgeben.
Oder wenn die Funktion nicht anonym ist:
wo Foo so definiert ist:
AKTUALISIEREN:
Nachdem Sie Ihr Update gesehen haben, scheinen Sie die Signatur der Funktion, die Sie aufrufen möchten, nicht im Voraus zu kennen. In .NET müssen Sie zum Aufrufen einer Funktion alle Argumente übergeben. Wenn Sie nicht wissen, welche Argumente verwendet werden, können Sie dies nur durch Reflektion erreichen.
Und hier ist eine andere Alternative:
Bei diesem Ansatz müssen Sie noch die Anzahl und den Typ der Parameter kennen, die an jede Funktion am entsprechenden Index des Wörterbuchs übergeben werden müssen. Andernfalls wird ein Laufzeitfehler angezeigt. Und wenn Ihre Funktionen keine Rückgabewerte haben, verwenden Sie
System.Action<>
stattdessenSystem.Func<>
.quelle
Dictionary<int, Delegate>
.Beginnen wir mit einigen Funktionen, die wie folgt definiert sind:
Sie haben wirklich 2 realisierbare Optionen zur Verfügung:
1) Sorgen Sie für Typensicherheit, indem Kunden Ihre Funktion direkt aufrufen.
Dies ist wahrscheinlich die beste Lösung, es sei denn, Sie haben sehr gute Gründe, von diesem Modell abzubrechen.
Wenn Sie davon sprechen, Funktionsaufrufe abfangen zu wollen, klingt es für mich so, als würden Sie versuchen, virtuelle Funktionen neu zu erfinden. Es gibt eine Vielzahl von Möglichkeiten, um diese Art von Funktionalität sofort einsatzbereit zu machen, z. B. das Erben von Funktionen von einer Basisklasse und das Überschreiben ihrer Funktionen.
Für mich klingt es so, als ob Sie eine Klasse wollen, die eher ein Wrapper als eine abgeleitete Instanz einer Basisklasse ist. Machen Sie also so etwas:
2) ODER ordnen Sie die Eingabe Ihrer Funktionen einer gemeinsamen Schnittstelle zu.
Dies kann funktionieren, wenn alle Ihre Funktionen miteinander verbunden sind. Wenn Sie beispielsweise ein Spiel schreiben und alle Funktionen einen Teil des Inventars des Spielers oder des Spielers beeinflussen. Sie würden mit so etwas enden:
quelle
object
solche, die an einen neuen Thread weitergegeben würde.Hey, ich hoffe das hilft. Aus welcher Sprache kommst du?
quelle
Warum nicht
params object[] list
für Methodenparameter verwenden und eine Validierung innerhalb Ihrer Methoden (oder der Aufruflogik) durchführen? Dies ermöglicht eine variable Anzahl von Parametern.quelle
Im folgenden Szenario können Sie ein Wörterbuch mit Elementen verwenden, um sie als Eingabeparameter einzusenden und dieselben Ausgabeparameter zu erhalten.
Fügen Sie zuerst die folgende Zeile oben hinzu:
Definieren Sie dann in Ihrer Klasse das Wörterbuch wie folgt:
Auf diese Weise können Sie diese anonymen Funktionen mit einer ähnlichen Syntax ausführen:
quelle
Definieren Sie das Wörterbuch und fügen Sie die Funktionsreferenz als Wert hinzu, wobei Sie
System.Action
als Typ verwenden:Rufen Sie es dann auf mit:
quelle