Laden...

Funktionsaufrufe als Value im Dictionary

Erstellt von Steff1905 vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.798 Views
S
Steff1905 Themenstarter:in
2 Beiträge seit 2017
vor 6 Jahren
Funktionsaufrufe als Value im Dictionary

Hi,

Ich bringe mir C# quasi selbst bei (nachdem ich schon jahrelang mit c++ arbeite). Ich möchte eine Datenstruktur hinterlegen und darauf zugreifen, in der ich direkt zu einer Funktion springen kann.

Z.B.:


Dictionary<string, ?> dic_Commands;

dic_Commands["Name"] = SetName();

Ist jetzt sehr einfach heruntergebrochen, aber ich hoffe ihr versteht was ich meine. In c++ schaffe ich das mittels eines typdefs:

*.h

typedef Rückgabetyp* (*Funktionsname)(Funktionsargument&) ;
std::map<std::string, Funktuionsname> m_mapCommands;

*.cpp

m_mapCommands.insert(make_pair("Name", &SetName));

Rückgabetyp* Klasse::SetName(Funktionsargument&)
{
...
}

Ich hoffe ihr könnt mir folgen und vor allem helfen! Danke im Vorraus,

Steffi

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo Steff1905,

ich hab nicht genau geschnallt was du machen magst, aber vielleicht denke ich auch einfach zu kompliziert.

Wäre eine Liste mit Objekten und auf den Objekten eine Funktion nicht das, was du willst?

Oder willst du im Nachhinein einem Property auf einem Objekt eine Funktion zuweisen?

[FAQ] Wie finde ich den Einstieg in C#?

Gruss

Coffeebean

1.029 Beiträge seit 2010
vor 6 Jahren

Hi,

ohne jetzt zu fragen wofür überhaupt, das würde sich denke mich mit Action bzw. Func ganz gut umsetzen lassen. Dann kannst du sogar anonyme Methoden nehmen. Beispiel:


class Program
	{
		static void Main(string[] args)
		{
			var dic_Commands = new Dictionary<string, Action>
			{
				[key: "Test1"] = () => Console.WriteLine(value: "Bla1"), // anonym
				[key: "Test2"] = Test2 // eigene methode
			};

			dic_Commands[key: "Test1"].Invoke();
			dic_Commands[key: "Test2"].Invoke();
			Console.ReadLine();
		}

		private static void Test2()
		{
			Console.WriteLine(value: "Bla2");
		}
	}

LG

PS:
Action gibt's auch Action<T> (hat dann Argumente)
An Stelle von Action kannst du auch Func<> verwenden wenn die Methoden Argumente und einen Rückgabewert brauchen.

W
955 Beiträge seit 2010
vor 6 Jahren

Hi,
schau Dir mal Action<> und Func<> an.

S
Steff1905 Themenstarter:in
2 Beiträge seit 2017
vor 6 Jahren

Ja "Action" ist genau das was sich suchte! Vielen Dank!

Der Compiler meckert jetzt aber dass die Funktion nur void zurück liefern darf!?

LG Steffi

P.S. Danke Func<> hat es gelöst!!!

4.931 Beiträge seit 2008
vor 6 Jahren

Hallo,

da es bisher noch nicht genannt wurde, das generelle Stichwort dazu lautet Delegate (bzw. als Schlüsselwort delegate).

F
10.010 Beiträge seit 2004
vor 6 Jahren

@Steff1905:
Wenn ich so eine Frage von C++ Leuten sehe, stelle ich erst mal die Frage was das ergeben soll,
denn in c# macht man vieles ganz anders als in C++.

Hier z.b. wäre wohl eher ein Liste von ICommands ( o.ä. ) sinnvoller.

Wäre es nicht sinnvoller darüber nachzudenken die Sprache richtig zu benutzen als zu versuchen alte Gewohnheiten "rüberzuretten"?

A
764 Beiträge seit 2007
vor 6 Jahren

Hallo Steff1905

Das Problem mit Action<> & Func<> an der Stelle ist, dass das Dictionary typisiert Initialisiert werden muss. Deswegen ist es sinnvoller (wie von FZelle vorgeschlagen) ein Dictionary mit ICommand zu benutzen.


Dictionary<string, ICommand> Commands;    [COLOR]  // die ungarische Notation (dic_) habe ich mal weggelassen. das ist nicht mehr so 'in'
[/color]
Commands["SetName"] = new DelegateCommand((parameter) => SetName((string) parameter)));
Commands["SetLength"] = new DelegateCommand((parameter) => SetLength((int)parameter), (parameter) => CanSetLength((int)parameter));

Commands["SetName"].Execute("Hans im Glück");

if(Commands["SetLength"].CanExecute(length))
{
   Commands["SetLength"].Execute(length);
}

Beispiele für DelegateCommand kannst du dir ergooglen.

Ganz unabhängig davon, gibt es für deinen Anwendungsfall, wahrscheinlich auch eine elegantere Lösung.

Viele Grüße
Alf

D
500 Beiträge seit 2007
vor 6 Jahren

Moin, moin,

naja...man kann ICommand nehmen oder koennte das Dictionary auch auf Dictionary<string, Delegate> umschreiben (siehe Hinweis von Th69).

Gruss,
Moe

F
10.010 Beiträge seit 2004
vor 6 Jahren

Man kann sich auch nen Knopf an die Backe nähen.

Ich meinte übrigens nicht unbedingt das WPF ICommand sondern irgendein Interface das ein Command beinhaltet.
Dadurch kann man ggf auch einen Status mit dem Befehl verwalten.

Aber wie gesagt, man sollte erst wissen was das wirklich ergeben soll.

D
500 Beiträge seit 2007
vor 6 Jahren

Ich dachte, dass ich nicht explizit darauf hinweisen muss, dass das abgeaenderte Dictionary lediglich eine Moeglichkeit von vielen ist, bevor man in Richtung ICommand geht und ohne, dass der eigentliche Use Case geschildert wurde.

@FZelle: Warum Du einen Knopf an der Backe moechtest oder hast, entzieht sich meinem Verstaednis, da das schon ziemlich doof aussieht. Aber das muss letztendlich jeder fuer sich entscheiden, welchem Schoenheitsideal man folgt.

Beste Gruesse