Übergeben Sie die Methode als Parameter mit C #
Habe ich mehrere Methoden mit der gleichen Signatur (Parameter und Rückgabewerte), aber unterschiedlichen Namen und den Interna der Methoden unterschiedlich sind. Ich möchten, übergeben Sie den Namen der Methode führen Sie eine weitere Methode aufrufen, wird die übergebene Methode.
public int Method1(string)
{
... do something
return myInt;
}
public int Method2(string)
{
... do something different
return myInt;
}
public bool RunTheMethod([Method Name passed in here] myMethodName)
{
... do stuff
int i = myMethodName("My String");
... do more stuff
return true;
}
public bool Test()
{
return RunTheMethod(Method1);
}
Dieser code funktioniert nicht, aber das ist, was ich versuche zu tun. Was ich nicht verstehe, ist, wie Sie schreiben, die RunTheMethod code da Brauch ich zum definieren der parameter.
Kommentar zu dem Problem
Warum nicht Sie einen Delegaten übergeben, anstatt den Namen der Methode?
InformationsquelleAutor der Frage user31673 | 2010-01-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die Func-Delegat .net 3.5 als parameter in Ihrem RunTheMethod Methode. Die Func-Delegaten können Sie angeben, eine Methode, die eine Reihe von Parametern eines bestimmten Typs und gibt ein einziges argument von einem bestimmten Typ. Hier ist ein Beispiel, das sollte funktionieren:
InformationsquelleAutor der Antwort Egil Hansen
Müssen Sie eine delegieren. In diesem Fall werden alle Ihre Methoden nehmen ein
string
parameter und Rückgabewertint
- das ist den meisten einfach dargestellt durch dieFunc<string, int>
delegieren1. So kann der code werden korrekt als einfache änderung wie diese:Delegierten haben viel mehr Leistung als diese, zugegeben. Zum Beispiel mit C# können Sie erstellen Sie einen Delegaten aus einem lambda-Ausdruck, so konnte man aufrufen, Ihre Methode so:
Wird eine anonyme Funktion wie folgt:
dann passieren, dass die Delegierten an der
RunTheMethod
Methode.Können Sie die Delegierten für die Ereignis-Abonnements, eine asynchrone Ausführung, Rückrufe - alle Arten von Dingen. Es lohnt zu Lesen, vor allem, wenn Sie verwenden möchten, LINQ. Ich habe eine Artikel die meist über die Unterschiede zwischen Delegaten und Ereignisse, aber Sie finden es vielleicht nützlich, sowieso.
1 Dies ist nur auf der Grundlage der generischen
Func<T, TResult>
delegieren, geben Sie den Rahmen vor; Sie könnten leicht erklären:wird und dann die parameter vom Typ
MyDelegateType
statt.InformationsquelleAutor der Antwort Jon Skeet
Können Sie auch versuchen, die Aktion zu Delegieren!
Und dann rufen Sie Ihre Methode mit
Oder
Dann rufen Sie einfach die Methode
InformationsquelleAutor der Antwort Zain Ali
Verwendung:
InformationsquelleAutor der Antwort kravits88
Sollten Sie eine
Func<string, int>
delegieren, das ist eine Funktion, die einstring
als argument und geben eineint
:Dann verwenden Sie es:
InformationsquelleAutor der Antwort Bruno Reis
Wenn Sie die Möglichkeit haben möchten, zu ändern, welche Methode aufgerufen wird, zur Laufzeit würde ich empfehlen den Einsatz einer Stellvertretung: http://www.codeproject.com/KB/cs/delegates_step1.aspx
Es wird Ihnen erlauben, ein Objekt erstellen, speichern Sie die Methode aufrufen, und übergeben Sie, um Ihre anderen Methoden, wenn es erforderlich ist.
InformationsquelleAutor der Antwort MadcapLaugher
Während die akzeptierte Antwort ist absolut richtig, ich würde gerne eine zusätzliche Methode.
Ich hier gelandet, nachdem ich meine eigene Suche nach einer Lösung, um eine ähnliche Frage.
Ich Baue ein plugin getrieben Rahmen und als Teil von ihm ich wollte, dass die Menschen in der Lage sein, hinzufügen, Menüpunkte, um das Anwendungen-Menü, um eine generische Liste, ohne dass eine tatsächliche
Menu
Objekt, da der Rahmen kann die Bereitstellung auf anderen Plattformen, die nicht überMenu
UI-Objekte. Hinzufügen Allgemeine Informationen über das Menü ist einfach genug, aber wenn die plugin-Entwickler genug Freiheit, um zu erstellen, die den callback, wenn das Menü angeklickt wurde, erweist sich als ein Schmerz. Bis es mir dämmerte, war ich versucht, das Rad neu zu erfinden und normalen Menüs aufrufen und auslösen der Rückruf von Veranstaltungen!So ist die Lösung, so einfach wie es klingt, sobald Sie es realisieren, fehlte mir bis jetzt.
Einfach erstellen Sie separate Klassen für die jeweils der aktuellen Methoden, geerbt von einem Ausgangspunkt, wenn Sie müssen, und einfach fügen Sie einen Ereignishandler für jeden.
InformationsquelleAutor der Antwort Wobbles
Hier ist ein Beispiel, Das kann Ihnen helfen, besser zu verstehen, wie die übergabe einer Funktion als parameter.
Angenommen, Sie haben Eltern Seite und Sie öffnen wollen, ein Kind popup-Fenster. In der übergeordneten Seite gibt es ein Textfeld gefüllt werden soll auf der Basis von Kind-popup-Textfeld.
Hier müssen Sie einen Delegaten sind.
Eltern.cs
//Deklaration der Delegierten
public delegate void FillName(String Vorname);
Erstellen Sie nun eine Funktion, die füllen Sie Ihr Textfeld, und sollte die Funktion map Delegierten
Nun auf die Schaltfläche klicken, die Sie öffnen müssen, um ein Kind popup-Fenster.
IN ChildPopUp Konstruktor müssen Sie parameter erstellen von Stellvertretung Art " übergeordneten //Seite
ChildPopUp.cs
InformationsquelleAutor der Antwort Shrikant-Divyanet Solution
Hier ist ein Beispiel ohne parameter:
http://en.csharp-online.net/CSharp_FAQ:_How_call_a_method_using_a_name_string
mit params:
http://www.daniweb.com/forums/thread98148.html#
dass Sie im Grunde übergeben in einem array von Objekten, die zusammen mit dem Namen der Methode. verwenden Sie dann beide mit der Invoke-Methode.
params Object[] Parameter
InformationsquelleAutor der Antwort Jeremy Samuel
For sharing eine möglichst vollständige Lösung, ich werde am Ende mit der Darstellung drei verschiedene weisen, dies zu tun, aber nun werde ich beginnen, die grundlegendsten Prinzip.
Kurze Einführung
Alle CLR (Common Language Runtime) Sprachen (wie C# und Visual Basic) unter einer VM, es nennt sich CLI (Common Language Interpreter) läuft der code auf einer höheren Ebene als native Sprachen wie C und C++ (die direkt kompiliert zu Maschinencode). Es folgt, dass Methoden nicht jede Art von kompilierten blockieren, aber Sie sind nur strukturierte Elemente, die CLR-erkennen und nutzen zu ziehen aus Ihrem Körper und rewing Sie an den inline-Anweisungen in den Maschinencode. Damit Sie nicht denken, Durchlaufen eine Methode als parameter, weil eine Methode nicht produzieren Wert von selbst: es ist kein Gültiger Ausdruck! So dass, Sie gehen zu stolpern, die delegate-Konzept.
Was ist ein delegate?
Delegierter repräsentiert einen Zeiger auf eine Methode. Weil (wie ich oben sagte) eine Methode ist nicht Wert, es gibt eine spezielle Klasse in CLR-Sprachen:
Delegate
. Diese Klasse umschließt jede Methode, und Sie können implizit umgewandelt in irgendeiner Weise.Blick auf das folgende Beispiel:
Die drei Möglichkeiten:
Weg 1
Verwenden Sie die
Delegate
Besondere Klasse direkt, wie das obige Beispiel. Das problem dieser Lösung ist, dass der code deaktiviert werden, wie Sie übergeben, die dynamisch Ihre Argumente, ohne eine Beschränkung auf die Arten von denen in der Deklaration der Methode.Weg 2/3
Neben der
Delegate
spezielle Klasse, die Delegierten Konzept breitet sich auf custom Delegierten, die Deklarationen von Methoden Voraus, diedelegate
Stichwort und Sie Verhalten sich wie eine normale Methode. Sie werden so überprüft, und Sie kommen zu einem "perfekte" code.Blick auf das folgende Beispiel:
Einer zweiten option, die durch diese Möglichkeit nicht, schreiben Sie Ihre eigenen benutzerdefinierten Delegaten ist mit einer von Ihnen erklärte in system-Bibliotheken:
Action
wickeltvoid
ohne Argumente.Action<T1>
wickeltvoid
mit einem argument.Action<T1, T2>
wickeltvoid
mit zwei Argumenten.Func<TR>
schließt eine Funktion mitTR
Rückgabetyp und ohne Argumente.Func<TR, T1>
schließt eine Funktion mitTR
zurück geben und mit einem argument.Func<TR, T1, T2>
schließt eine Funktion mitTR
zurück geben und mit zwei Argumenten.(Dieser letztgenannten Lösung ist, dass viele Leute gepostet.)
InformationsquelleAutor der Antwort Davide Cannizzo