2013-08-04 8 views
6

Ist es möglich, den Namen einer anderen Methode in der gleichen Klasse aber ohne mit einer manuell geschriebenen Zeichenfolge zu erhalten?Wie bekomme ich den Methodennamen von einer bekannten Methode?

class MyClass { 

    private void doThis() 
    { 
     // Wanted something like this 
     print(otherMethod.name.ToString()); 
    } 

    private void otherMethod() 
    { 

    } 
} 

können Sie fragen, warum: gut der Grund ist, dass ich wie diese Invoke später die Methode aufrufen müssen („otherMethod“), aber ich möchte nicht diese Zeichenfolge selbst codieren, da ich nicht Refactoring kann es mehr innerhalb des Projekts.

+0

können Sie Reflexion verwenden, um dies zu erreichen. –

+0

Welche Version von C# verwenden Sie? – Mehrdad

Antwort

8

Ein Ansatz ist, dass Sie es in Delegat Action wickeln können, dann können Sie den Namen der Methode zuzugreifen:

string name = new Action(otherMethod).Method.Name; 
+1

Danke das funktioniert! Verdammt, ich sah in GetType() und GetMethods() aber diese "neue Aktion", von der ich noch nie gehört habe. Kleine Frage: Wenn ich die neue Aktion benutze, hoffe ich, dass die Methode nicht ausgeführt wird (es braucht nur den Namen), ist das richtig? – Malvin

+2

Wenn Sie mit dem Delegate-Ansatz gehen, brauchen Sie keinen Namen zu erhalten (und den Aufruf über Reflektion zu überspringen) - verwenden Sie einfach die resultierende 'Action', um die Methode später auszuführen. –

+2

Woah! Ziemlich toll, ich wusste nicht, dass du das kannst. –

2

Sie Reflektion verwenden können (Beispiel - http://www.csharp-examples.net/get-method-names/) die Methodennamen zu erhalten. Sie können dann nach der Methode suchen, nach der Sie suchen, nach Namen, Parametern oder sogar nach einem Attribut, um es zu markieren.

Aber die eigentliche Frage ist - sind Sie sicher, dass das ist, was Sie brauchen? Das sieht so aus, als ob Sie keine Reflexion benötigen, sondern über Ihr Design nachdenken müssen. Wenn Sie bereits wissen, welche Methode Sie aufrufen werden, warum brauchen Sie den Namen? Wie wäre es mit einem Delegierten? Oder die Methode über eine Schnittstelle verfügbar machen und einen Verweis auf eine Klasse speichern, die sie implementiert?

1

Versuchen Sie folgendes:

MethodInfo method = this.GetType().GetMethod("otherMethod"); 
object result = method.Invoke(this, new object[] { }); 
0

Btw. Ich fand auch (in den Erweiterungen des Internets) eine alternative Lösung, um nur den String einer Methode zu erhalten. Es funktioniert auch mit Parametern und Rückgabetypen:

System.Func<float, string> sysFunc = this.MyFunction; 
string s = sysFunc.Method.Name; // prints "MyFunction" 

public string MyFunction(float number) 
{ 
    return "hello world"; 
} 
+0

Dies ist der von der akzeptierten Antwort verwendete Ansatz. – Servy

+0

Der einzige Unterschied ist, dass dies auch bei nicht void-Methoden funktioniert. – Malvin

+0

Der Ansatz ist identisch, Sie müssten natürlich den Typ 'Action' /' Func' verwenden, der mit der Signatur der Methode übereinstimmt. Das Beispiel im OP ist eine parameterlose Void-Funktion, die "Action" bedeutet. Sie können 'Func' nicht für eine solche Methode verwenden. – Servy