So rufen Sie delegieren von string, die in C#?
ist es möglich, rufen Sie einen Delegaten in einer Variablen gespeichert, indem Sie die variable name (als string)? ich denke, ich hätte zu verwenden, reflection-Mechanismus, aber ich bin nicht immer überall
Beispiel-code:
class Demo {
public delegate int DemoDelegate();
private static int One() {
return 1;
}
private static void CallDelegate(string name) {
//somehow get the value of the variable with the name
//stored in "name" and call the delegate using reflection
}
private static void CallDelegate(string name, DemoDelegate d) {
d();
}
static void main(string[] args) {
DemoDelegate one = Demo.One;
CallDelegate(one);
//this works, but i want to avoid writing the name of the variable/delegate twice:
CallDelegate("one", one);
}
}
ist das überhaupt möglich? wenn ja, wie? wenn nicht, dann muss ich das mit der zweiten form, Pech
- Mit
DemoDelegate d
im zweiten überlastung völlig Niederlagen der Zweck derstring name
, nicht wahr? - ja, das ist der Grund, warum ich es vermeiden wollen (in meinem code, ich möchte speichern Sie den Namen der Variablen zu
Console.Out.WriteLine()
es später) - Es gibt eine Reihe von grundlegenden Fehler Sie hier.
One()
ist eine Instanz-Methode für ein-und greifen Sie aufthis
aus, die innerhalb einer statischen Methode. Was wollen Sie anrufen? Die Instanz-MethodeOne()
oder der Delegierte in der lokalen variable gespeichert, die inmain()
,one
? - wenn Sie nur wollen, speichern den Namen der Variablen ein, warum man nicht einfach "dabei.delegateMember.Methode.Name"? das macht mehr Sinn für mich, als das zu tun dodgy Reflexion hacks?
- vielen Dank für die Erwähnung, es behoben. und ich möchte, dass Sie den Delegaten aufrufen in der lokalen variable gespeichert "one" (Kleinbuchstaben)
- Vielleicht vermisse ich den Punkt hier, aber Sie haben bereits eine Instanz des Delegaten in
one
. Sie brauchen nicht Ihren Namen in der Lage sein, um es aufzurufen. Wenn Sie benötigen, um Zugang zu denOne()
Methode aus einer anderen Klasse, das wäre ein anderer Fall ist, jedoch. - dies ist nur Beispiel-code, um deutlich zu machen möchte ich nennen, einen Delegierten (und nicht eine Methode direkt)
- Ich änderte meine Antwort zu schreiben, der name der Variablen, an die Konsole, später, als Sie vorgeschlagen, in einem früheren Kommentar.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist möglich, so lange wie Sie Linq-Ausdrücke, und wenig Reflexion.
Werfen Sie einen Blick auf diesen code, es hat etwas ähnliche was ich denke, Sie wollen:
Variablen kaum vorhanden. Der einzige Weg, um zuverlässig eine call-by-string (in diesem Szenario) wäre zum speichern der Delegierten in einem Wörterbuch:
Speichern jetzt, das Wörterbuch irgendwo (in einem Feld, in der Regel), und tun Sie etwas wie:
Offensichtlich schränkt Sie mit parametrisierten Delegierten.
switch
oder eineDictionary
(das ist das, was Marc vorgeschlagen seine Antwort.Kann man nicht wirklich Zugriff auf Variablen in einem anderen stack-frame (obwohl ich denke, dass es möglich ist, mit Hack rund um die
StackFrame
Klasse). Stattdessen werden Sie wollen, um eineDelegate
Objekt und verwenden Sie Methoden wieDynamicInvoke
, wenn Sie aufrufen möchten, eine generalisierte Stellvertreter in einer Reflexion-Art.