2016-08-14 4 views
2

Viele Male hatte ich Sachen ähnlich wie dies zu tun:Wie verknüpfe ich einen Wert mit einem Funktionsaufruf?

if (value == certainValueA) call functionA() 
if (value == certainValueB) call functionB() 

ich es immer so getan haben. Aber jetzt habe ich über 50 solcher Fälle und dieser Weg scheint schlecht zu sein.

Ich möchte einen effizienteren Weg, es zu tun. Die Lösung ist wahrscheinlich gut dokumentiert, aber bisher liefert die Kombination von Wörtern, mit denen ich solche Dinge finde, keine interessanten Ergebnisse.

Ich brauche meistens eine Richtung auf was zu schauen.

+0

Die Funktionen zum Anrufen haben alle die gleiche Signatur? – Steve

+0

im aktuellen Fall ja, aber ich habe einige Fälle in der Basis, die sie nicht –

+1

Haben Sie in Betracht gezogen, eine Karte mit Ihren Werten von Interesse als der Index (oder Schlüssel, wenn sie nicht ganze Zahlen sind) und die Funktionen als Deine Werte? – ray

Antwort

6

Sie können ein Wörterbuch mit Delegierten verwenden; etwas wie:

var dispatch = new Dictionary<TypeOfValue, Action>() { 
    { certainValueA,() => functionA() }, 
    { certainValueB,() => functionB() }, 
}; 

TypeOfValue value = // get value here 

dispatch[value](); 
+0

Sind Sie sicher, dass die Werte nicht aufgerufen werden? Sollte es nicht '() => functionA' sein (keine Klammern beachten)? – ray

+4

Die Werte werden nicht beim Deklarieren des Wörterverzeichnisses aufgerufen, da '() =>' eine Aktion definiert, die sie nicht aufruft. Du könntest auch sagen '{bestimmteValueA, FunktionA}' - was genauso funktionieren würde. – Blorgbeard

+0

Verstanden. Ich hatte dein zweites Beispiel im Sinn. Danke für die Klärung des 1. Falles. – ray

Verwandte Themen