Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Funktionsaufrufe als Value im Dictionary
Steff1905
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

Funktionsaufrufe als Value im Dictionary

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.209
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Taipi88
myCSharp.de - Member

Avatar #avatar-3220.jpg


Dabei seit:
Beiträge: 1.029
Herkunft: Mainz

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Taipi88 am .
private Nachricht | Beiträge des Benutzers
witte
myCSharp.de - Member



Dabei seit:
Beiträge: 955

beantworten | zitieren | melden

Hi,
schau Dir mal Action<> und Func<> an.
private Nachricht | Beiträge des Benutzers
Steff1905
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

beantworten | zitieren | melden

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!!!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Steff1905 am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.643

beantworten | zitieren | melden

Hallo,

da es bisher noch nicht genannt wurde, das generelle Stichwort dazu lautet Delegate (bzw. als Schlüsselwort delegate).
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10.006

beantworten | zitieren | melden

@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"?
private Nachricht | Beiträge des Benutzers
Alf Ator
myCSharp.de - Member



Dabei seit:
Beiträge: 700

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
DaMoe80
myCSharp.de - Member



Dabei seit:
Beiträge: 500

beantworten | zitieren | melden

Moin, moin,

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

Gruss,
Moe
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10.006

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
DaMoe80
myCSharp.de - Member



Dabei seit:
Beiträge: 500

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers