So:
Dictionary<int, Func<string, bool>>
Auf diese Weise können Sie Funktionen speichern, die einen String-Parameter übernehmen und boolean zurück.
dico[5] = foo => foo == "Bar";
Oder, wenn die Funktion nicht anonym:
dico[5] = Foo;
wo Foo wie folgt definiert ist:
public bool Foo(string bar)
{
...
}
UPDATE: es
Nachdem ich das Update scheint, dass Sie nicht im Voraus wissen die Signatur der Funktion, die Sie aufrufen möchten. Um in .NET eine Funktion aufzurufen, müssen Sie alle Argumente übergeben, und wenn Sie nicht wissen, was die Argumente sein werden, können Sie dies nur durch Reflexion erreichen.
Und hier ist eine andere Alternative:
class Program
{
static void Main()
{
// store
var dico = new Dictionary<int, Delegate>();
dico[1] = new Func<int, int, int>(Func1);
dico[2] = new Func<int, int, int, int>(Func2);
// and later invoke
var res = dico[1].DynamicInvoke(1, 2);
Console.WriteLine(res);
var res2 = dico[2].DynamicInvoke(1, 2, 3);
Console.WriteLine(res2);
}
public static int Func1(int arg1, int arg2)
{
return arg1 + arg2;
}
public static int Func2(int arg1, int arg2, int arg3)
{
return arg1 + arg2 + arg3;
}
}
Mit diesem Ansatz müssen Sie noch die Anzahl und Art der Parameter kennen, die jeder Funktion in dem entsprechenden Index des Wörterbuchs übergeben werden müssen, oder Sie werden Laufzeit erhalten Error. Und wenn Ihre Funktionen keine Rückgabewerte haben, verwenden Sie System.Action<>
anstelle von System.Func<>
.
Dies ist ein großartiges Idiom - kann böse Schaltanweisungen ersetzen. –
Ihre Beispielfunktion hat Parameter. Wenn Sie die gespeicherte Funktion aufrufen, rufen Sie sie jedoch ohne Argumente auf. Sind die Argumente beim Speichern der Funktion behoben? –
Das war nur ein schlecht geschriebenes Beispiel für mich. Ich weiß nicht, ein Wörterbuch zu erstellen, das es tun würde, weil die Funktionssignatur immer anders ist. – chi