2013-08-04 14 views
6

È possibile ottenere il nome di un altro metodo nella stessa classe ma senza utilizzando una stringa scritta manualmente?Come ottenere il metodoname da un metodo noto?

class MyClass { 

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

    private void otherMethod() 
    { 

    } 
} 

Si può chiedere perché: ben il motivo è che devo richiamare il metodo seguito in questo modo Invoke ("otherMethod"), però io non voglio hardcode questa stringa me stesso come io non posso refactoring è più all'interno del progetto.

+0

è possibile utilizzare la riflessione per ottenere ciò. –

+0

Quale versione di C# stai usando? – Mehrdad

risposta

8

Un approccio è quello che si può avvolgere in delegato Action, allora si può accedere al nome del metodo:

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

Grazie funziona! Accidenti ho guardato in GetType() e GetMethods() ma questa "nuova azione" non ho mai sentito. Piccola domanda: quando uso la nuova azione spero che il metodo all'interno non venga eseguito (prende solo il nome), è corretto? – Malvin

+2

Se si utilizza l'approccio delegate, non è necessario ottenere il nome (e quindi ignorare il richiamo tramite riflessione): basta usare l'azione risultante per eseguire il metodo in un secondo momento. –

+2

Woah! Piuttosto fantastico, non sapevo che puoi farlo. –

2

È possibile utilizzare la riflessione (ad esempio - http://www.csharp-examples.net/get-method-names/) per ottenere i nomi dei metodi. È quindi possibile cercare il metodo che si sta cercando per nome, parametri o anche utilizzare un attributo per taggarlo.

Ma la vera domanda è: sei sicuro che questo è ciò di cui hai bisogno? Sembra che tu non abbia davvero bisogno di riflessioni, ma devi pensare al tuo design. Se sai già quale metodo invocherete, perché avete bisogno del nome? Che ne dici di usare un delegato? O esponendo il metodo tramite un'interfaccia e memorizzando un riferimento ad alcune classi che lo implementano?

1

Prova questo:

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

Btw. Ho anche trovato (nelle espansioni di internet) una soluzione alternativa solo per ottenere la stringa di un metodo. Funziona anche con parametri e tipi di ritorno:

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

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

Questo è l'approccio utilizzato dalla risposta accettata. – Servy

+0

L'unica differenza è che questo funziona anche con metodi non vuoti. – Malvin

+0

L'approccio è identico, ovviamente dovresti usare il tipo 'Action' /' Func' che corrisponde alla firma del metodo. L'esempio nell'OP è una funzione nullo senza parametri, che significa "Azione". Tu * non puoi * usare 'Func' per un tale metodo. – Servy