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
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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.
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!!!
@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"?
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
Moin, moin,
naja...man kann ICommand nehmen oder koennte das Dictionary auch auf Dictionary<string, Delegate> umschreiben (siehe Hinweis von Th69).
Gruss,
Moe
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.
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