2017-02-13 5 views
0

Parameter Nehmen wir an, wir ein Wörterbuch initialisieren, wo wir unsere Methoden speichern wollen:erstellen Wörterbuch mit Nschaltend

public Dictionary<string, Action<int>> Dic = Dictionary<string, Action<int>>; 


public void one(int a) {}; 
public void two(int a, int b) {}; 

Frage: Gibt es das überhaupt zu sagen, dass es entweder 1 oder 2 Ints als haben kann Parameter? Gerade jetzt im tut dies als Behelfslösung:

public void one(int a, int b) {}; 
public void two(int a, int b) {}; 

nun beide haben zwei Parameter, obwohl der erste braucht man nur 1

eine Lösung?

+2

warum nicht Sie verwenden ein Array als eine Eingabe? Oder Liste? –

+5

Können Sie bitte zeigen, wie Sie dieses Wörterbuch benutzen werden? Wie werden Sie wissen, dass Dic ["foo"] nur 'a' Parameter benötigt und Dic [" bar "] beides benötigt? –

+0

@SergeyBerezovskiy Ich möchte meine Methoden tatsächlich speichern, so dass ich sie später per String aufrufen kann ... Genau wie Sie gerade – Asperger

Antwort

1

Die Verwendung der maximalen Anzahl von Parametern, die und künstlich mehr Argumente zu schaffen auftreten wird (ein Ansatz, der scherzend de-schönfinkelization genannt werden) macht es erforderlich, die maximale Anzahl von Argumenten zu wissen vorher (ohne Berücksichtigung der Tatsache, dass die predefined delegates Unterstützung " nur "bis zu 9 Argumenttypen); jedoch, wenn durch einen anderen Mechanismus Sie ohnehin die Anzahl der Argumente wissen, könnten Sie einfach

verwenden
Dictionary<string, object> 

die Delegierten zu speichern und sie wieder auf die gewünschte Art gegossen wie folgt.

((Action<int,int,int>)Dic["foo"])(1,2,3) 
+1

Sie können Delegaten nicht als Objekte speichern oder liege ich falsch? funktioniert nicht für mich – Asperger

+1

@Asperger [sicher können Sie] (http://rextester.com/NSTOM22314) – Jamiec

+1

@Jamiec aber nicht dict.Add ("Foo", fooBar); – Asperger

0

ich mit den Argumenten zustimmen, dass Ihre Probleme am besten auf den Code Design-Ebene gelöst werden - aber, dass gesagt wird, ich glaube, Sie erreichen können, was Sie dynamic mit wollen:

static void Action(int a) 
{ 
    Console.WriteLine(a); 
} 

static void Action(int a, int b) 
{ 
    Console.WriteLine(a + b); 
} 

static void Main(string[] args) 
{ 
    Dictionary<string, dynamic> Dic = new Dictionary<string, dynamic>(); 
    Dic.Add("ActionA", new Action<int>(Action)); 
    Dic.Add("ActionB", new Action<int, int>(Action)); 
    Dic["ActionB"](4, 5); 
} 
Verwandte Themen